在java并发编程实践书中,3.4节的不可变性那个小节,有处不明,向各位请教:“尽管存储姓名的set是可变的,但是ThreeStooges的设计使得它在被创建后就不可能再修改set。Stooges 的引用时final类型,所有所有对象状态只能通过final域询问”其中这个设计怎么就使得被创建后不能修改set 了?之后还是可以add的啊?代码如下: 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>();
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>();而不是说不能对其所提供的函数进行操作。
而你add方法,并没有改变对象引用,只是你引用的对象的内容变化了。
你试试
public static void main(String[] args){
ThreeStooges t = new ThreeStooges();//此处new,构造函数已经完成
t.stooges = new HashSet<String>();
}