代码之家  ›  专栏  ›  技术社区  ›  tryingToLearn

不可变类的策略-这是矛盾吗?

  •  2
  • tryingToLearn  · 技术社区  · 9 年前

    这个 strategy for defining an immutable class

    1. 将该字段标记为私有和最终字段
    2. 不提供setter

    当我将字段标记为 private final ,省略二传会带来什么额外的安全?

    由于字段是私有的,因此在没有类方法的情况下无法在类外部访问它。但由于它也是最终的,因此在初始化后无法修改。

    假设,在下面的类中,如果我没有在突出显示的2个位置初始化字段,那么编译器将给我错误消息,即最终的空白字段尚未初始化,这意味着

    class MyImmutable {
      private final int field1; // either initialze here
    
      MyImmutable() {
         this.field1 = ... ; // or here
      }
    }
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   Vince    9 年前

    不。本文只是明确介绍了不可变类型的属性。

    修改字段或字段引用的对象的方法

    private final 并不总是确保不变性。在你的例子中, 足够了,因为 field1

    修改的方法 字段或

    如果 MyImmutable 由可变类型组成,setter可以将调用委托给它们,从而导致 无论字段是否在 我的不可变 或者不是。

    下面是一个使用 私人决赛

    @Immutable
    class Person {
        private final Identity identity; // Identity is a mutable type
    
        public void changeNameTo(String name) {
            identity.changeNameTo(name); // private final can't prevent this
        }
    }
    
    @Mutable
    class Identity {
        private String name;
    
        public void changeNameTo(String name) {
            this.name = name;
        }
    }
    

    decomposing 现有代码。