Java:私有方法vs最终类
问题描述:
我在Java中学习不变性时遇到了这个问题。据说为了使一个类不可变,这个类应该被声明为final,这样它的方法就不能被扩展。我有这样一个问题,如果我在java中标记私有方法或方法final,我可以达到相同的效果。如果我这样做,我不必把班级标记为最终的。我得到这个正确的。你对此的看法高度赞赏。Java:私有方法vs最终类
答
非终极类没有公共变异方法或字段的事情是,你仍然可以继承它的子类。
说你有这样的不可变类:
class Point {
private int x, y;
// getters
// constructors
}
该类没有公共诱变方法或字段,但它不是最终的,所以其他人还可以继承它,使其变更:
class MyPoint extends Point {
public int foo;
}
现在突然间,您可以根据需要更改foo
的值。 MyPoint
现在变得可变!
这就是为什么你应该将不可变类标记为final。
答
A final
Java中的类不能被子类化。这意味着,根据定义,其方法不能重载,也不能向类中添加新的方法(行为)。另一方面,如果你要标记一个类final
的所有方法,那么它意味着不同的东西。方法不能被覆盖或隐藏。但是,单独标记所有方法final
仍然可以将该类继承为子类,并将新方法/行为添加到该类中。
答
允许重写一个不可变的类也允许添加可变数据。
class SuddenlyMutableString extends String {
private int id;
public int getId() { return id; }
public void setId(int i) { id = i; }
}
所以当你的方法设置final
可以防止现有数据的可变性,你可能仍然得到可变的子类。
这个问题本身解释什么是目标*是为了使一个类不可变*而不是使方法不被重写。 – nullpointer
如果您在子类中添加新的方法和字段@kltis – VedX