关于对象是否具备不可变性的疑惑
来源:8-4 栈封闭技术

慕沐3053333
2020-03-17
public class ImmutableDemo {
private Set<String> students = new HashSet<>();
public ImmutableDemo() {
students.add("李小美");
students.add("王壮");
students.add("徐福记");
}
public boolean isStudent(String name) {
return students.contains(name);
}
}
上述类的对象中,student属性是private修饰,并且也没有向外暴露修改其状态的方法,这个对象是否具备不可变性?但是它的student属性又没有final修饰,不符合您对对象不可变的第二个条件定义:
所以您总结出的对象不可变的条件是否有不妥?
个人认为:第一个条件是对象具有不可变性的表现特征,而不是条件。
第二个条件是希望对象具有不可变性的一种举措,当然这种举措不一定使得对象具有不可变性,还需要引用类型属性指向的对象具备不可变性。而且这种举措可有可无(如所有属性是private且不向外提供修改其属性的方法)。
简而言之,“对象创建后,其状态就不能修改”是“对象具备不可变性”的充分必要条件。
“所有属性都是final修饰” 不是“ 对象具备不可变性” 的必要条件,
写回答
2回答
-
悟空
2020-03-17
正如上面所说,所有域都是final类型的这个条件,并不是一个必要条件,但是是大多数情况下的必要条件,如果我们的情况特殊,那么可以不是final的,依然保持不可变。
00 -
悟空
2020-03-17
小伙伴的问题很好,下面我给出Java并发编程实战对于不可变的介绍:
00
相似问题