使对象不可变的可能方法

时间:2009-06-19 09:40:35

标签: java immutability

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

3 个答案:

答案 0 :(得分:8)

  1. 所有字段必须是 private,最好是final
  2. 确保课程不能 被覆盖 - 让课程最终, 或使用静态工厂并保持 建设者私人
  3. 必须填写字段 构造/工厂
  4. 不要为此提供任何制定者 字段
  5. 留意收藏品。使用 Collections.unmodifiable*。此外,集合应仅包含不可变对象
  6. 所有吸气剂必须提供 不可变对象或使用defensive copying
  7. 不提供任何方法 改变了内部的状态 对象。
  8. Tom Hawtin指出final可以是可选的。 String class有一个缓存hash var,仅在调用哈希函数时分配。

答案 1 :(得分:1)

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

有关详细信息,请参阅Wikipedia

答案 2 :(得分:1)

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

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

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

你需要担心对象图!

对象上的任何方法都需要注意非最终字段。例如。 String.add创建字符串。如果你需要改变一个字段 - 通过复制构造函数来实现。

最后让对象最终。