如果你不标记该类
final,那么我可能会突然使你看似不变的类真正变得可变。例如,考虑以下代码:
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可以防止这种情况的发生。



