我读到这个是为了制作 class immutable在Java中,我们应该执行以下操作,
- 不提供任何 setter
- 将所有字段标记为私有(private)
- 将类(class)定为 final类
为什么需要第 3 步?为什么我应该将类标记为final
?
最佳答案
如果你没有将类标记为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
的行为,以读取在我的子类中声明的新的可变字段。因此,您的类最初看起来是不可变的,但实际上并不是不可变的。我可以在任何需要 Immutable
对象的地方传递这个 Mutable
对象,假设该对象确实是不可变的,这可能会对代码造成非常糟糕的影响。将基类标记为 final
可以防止这种情况发生。
关于java - 为什么要在 Java 中将不可变类声明为 Final?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59551744/