当我在java中研究不变性时,我遇到了这个问题。据说为了使类不可变,该类应该被声明为final,以便它的方法不能被扩展。我有一个问题,如果我在java中标记方法private或方法final,我可以实现相同的目标。如果我这样做,我就不必将该课程标记为最终。我说得对。您对此的看法高度赞赏。
答案 0 :(得分:4)
Java中的final
类不能被子类化。这意味着,根据定义,其方法不能重载,也不能将新方法(行为)添加到类中。另一方面,如果你要标记类final
的所有方法,那么它意味着不同的东西。无法覆盖或隐藏final
方法。但是,单独标记所有方法final
仍然允许对类进行子类化并添加新的方法/行为。
答案 1 :(得分:1)
允许覆盖不可变类也允许添加可变数据。
class SuddenlyMutableString extends String {
private int id;
public int getId() { return id; }
public void setId(int i) { id = i; }
}
因此,将方法设置为final
可能会阻止现有数据的可变性,您仍可能会获得可变的子类。
答案 2 :(得分:1)
具有非最终类但没有公共变异方法或字段的东西是你仍然可以将它子类化。
假设你有这个不可变的类:
class Point {
private int x, y;
// getters
// constructors
}
这个类没有公共变异方法或字段,但它不是最终的,所以其他人仍然可以将其子类化以使其变为可变:
class MyPoint extends Point {
public int foo;
}
现在突然你可以根据需要更改foo
的值。 MyPoint
现在变得可变了!
这就是为什么你应该将不可变类标记为final。