日期:2014-05-20  浏览次数:20682 次

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>();
   }