如果你不标记类的最终,这可能是我突然让你看似不可变的类实际上是可变的。例如,考虑这个代码:
public class Immutable {
private final int value;
public Immutable(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
现在,假设我做以下:
public class Mutable extends Immutable {
private int realValue;
public Mutable(int value) {
super(value);
realValue = value;
}
public int getValue() {
return realValue;
}
public void setValue(int newValue) {
realValue = newValue;
}
public static void main(String[] arg){
Mutable obj = new Mutable(4);
Immutable immObj = (Immutable)obj;
System.out.println(immObj.getValue());
obj.setValue(8);
System.out.println(immObj.getValue());
}
}
注意,在我的Mutable子类中,我重写了getValue的行为来读取一个在我的子类中声明的新的可变字段。因此,你的类,最初看起来不可变,真的是不可变的。我可以传递这个Mutable对象在任何一个Immutable对象的期望,这可以做非常坏的东西代码假设对象是真正的不可变的。标记基类final可以防止这种情况的发生。
希望这可以帮助!