java并发编程实践读书问题
在java并发编程实践书中,3.4节的不可变性那个小节,有处不明,向各位请教:
“尽管存储姓名的set是可变的,但是ThreeStooges的设计使得它在被创建后就不可能再修改set。Stooges 的引用时final类型,所有所有对象状态只能通过final域询问”
其中这个设计怎么就使得被创建后不能修改set 了?之后还是可以add的啊?
代码如下:
Java code
public final class ThreeStooges{
private final Set<String> stooges = new HashSet<String>();
public ThreeStooges(){
stooges.add("1");
stooges.add("2");
}
//这里是测试代码
public static void main(String[] args){
ThreeStooges t = new ThreeStooges();//此处new,构造函数已经完成
t.stooges.add("3");//但是这里还是能add,怎么书中就说这就不能再改变了
}
}
------解决方案--------------------它的意思是:
private final Set<String> stooges = new HashSet<String>();
中的stooges不能再被赋值。
也就是不能:
stooges = new HashSet<String>();
而不是说不能对其所提供的函数进行操作。
------解决方案--------------------final 修饰 不能改变改对象引用,也就是说 stooges 指向是 new HashSet<String>()内存的地址,不能更改了。
而你add方法,并没有改变对象引用,只是你引用的对象的内容变化了。
------解决方案--------------------一般情况下,说一个类的state不可变,指的是该state不能或不会被赋新值
附个广告,java 并发群:229609257,1楼就在群里哦
------解决方案--------------------.........说的是stooges这个引用不能再改变
你试试
Java code
public static void main(String[] args){
ThreeStooges t = new ThreeStooges();//此处new,构造函数已经完成
t.stooges = new HashSet<String>();
}