使对象不可变的可能方法

我正在寻找一种有效的方法来构建一个不可变的类,就像Java的String类一样。

  1. 所有字段必须是private ,最好是final
  2. 确保不能覆盖类 – 使类最终,或使用静态工厂并保持构造函数私有
  3. 必须从构造函数/工厂填充字段
  4. 不要为字段提供任何setter
  5. 留意collections品。 使用Collections.unmodifiable* 。 此外,集合应仅包含不可变对象
  6. 所有getter必须提供不可变对象或使用防御性复制
  7. 不提供任何更改Object的内部状态的方法。

Tom Hawtin指出final可以是可选的。 String class有一个缓存hash var,仅在调用哈希函数时分配。

如果使用构造函数填充所有字段并将字段设为最终字段 – 那么您就在那里。

如果字段使用自定义类型 – 您可能还需要使它们不可变。

作为集合的任何字段都应使用不可修改的集合 – 为安全起见。

你需要担心对象图!

对象上的任何方法都需要注意非final字段。 例如,String.add创建一个新的 String。 如果你需要改变一个字段 – 通过复制构造函数这样做。

最后使对象最终。

如果一个对象都不能被修改,那么该对象是不可变的,因此这些字段必须是final 。 如果你不希望你的对象被子类化,你可以使类本身也是final ,就像String一样。 要轻松构造包含大量信息的不可变对象,您应该查看工厂模式

有关更多信息,请参阅Wikipedia