1

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

4

3 回答 3

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

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

于 2009-06-19T09:52:46.410 回答
1

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

有关更多信息,请参阅维基百科

于 2009-06-19T09:43:07.753 回答
1

如果您使用构造函数填充所有字段并使这些字段成为最终字段 - 您已经完成了一半。

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

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

您需要担心对象图!

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

最后使对象最终。

于 2009-06-19T09:48:02.907 回答