如何解决为什么要用Java声明一个不变的类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
读取我的子类中声明的新的可变字段的行为。结果,你的类(最初看起来是不可变的)实际上并不是不可变的。我可以Mutable
在需要对象的任何地方传递该对象Immutable
,如果该对象确实是不可变的,则可以对代码做非常不好的事情。标记基类final
可以防止这种情况的发生。
解决方法
我读到要使一个类在Java中不可变,我们应该执行以下操作:
- Do not provide any setters
- Mark all fields as private
- Make the class final标记为私有
为什么需要步骤3?我为什么要上课final
呢?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。