在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,怎么书中就说这就不能再改变了
   }
  }

解决方案 »

  1.   

    它的意思是:
    private final Set<String> stooges = new HashSet<String>();
    中的stooges不能再被赋值。也就是不能:
    stooges = new HashSet<String>();而不是说不能对其所提供的函数进行操作。
      

  2.   

    final 修饰 不能改变改对象引用,也就是说 stooges 指向是 new HashSet<String>()内存的地址,不能更改了。
    而你add方法,并没有改变对象引用,只是你引用的对象的内容变化了。
      

  3.   

    一般情况下,说一个类的state不可变,指的是该state不能或不会被赋新值附个广告,java 并发群:229609257,1楼就在群里哦
      

  4.   

    .........说的是stooges这个引用不能再改变
    你试试
    public  static void main(String[] args){
        ThreeStooges t = new ThreeStooges();//此处new,构造函数已经完成
        t.stooges = new HashSet<String>();
       }