我正在寻找一些有效的方法来构建一个不可变的类,就像 Java 的 String 类一样。
问问题
1322 次
3 回答
8
- 所有字段必须是
private
并且最好是final
- 确保类不能被覆盖 - 使类最终,或使用静态工厂并保持构造函数私有
- 必须从构造函数/工厂填充字段
- 不要为字段提供任何设置器
- 注意收藏。使用
Collections.unmodifiable*
. 此外,集合应该只包含不可变对象 - 所有 getter 必须提供不可变对象或使用防御性复制
- 不要提供任何改变对象内部状态的方法。
Tom Hawtin指出,这final
可以是可选的。String
class
有一个hash
仅在调用哈希函数时分配的缓存变量。
于 2009-06-19T09:52:46.410 回答
1
如果您使用构造函数填充所有字段并使这些字段成为最终字段 - 您已经完成了一半。
如果字段使用自定义类型 - 您可能还需要使它们不可变。
任何作为集合的字段都应该使用不可修改的集合——为了安全起见。
您需要担心对象图!
对象上的任何方法都需要注意非最终字段。例如,String.add 创建一个新字符串。如果您需要改变一个字段 - 通过复制构造函数进行。
最后使对象最终。
于 2009-06-19T09:48:02.907 回答