题
我正在寻找一种有效的方法来构建一个不可变的类,就像Java的String类一样。
解决方案
- 所有字段必须是
private
,最好是final
- 确保课程不能 被覆盖 - 让课程最终, 或使用静态工厂并保持 建设者私人
- 必须填写字段 构造/工厂
- 不要为此提供任何制定者 字段
- 留意收藏品。使用 <代码> Collections.unmodifiable * 代码>。此外,集合应仅包含不可变对象
- 所有吸气剂必须提供 不可变对象或使用防御性复制
- 不提供任何方法 改变了内部的状态 对象。 醇>
Tom Hawtin 指出 final
可以是可选的。 String
class
有一个缓存 hash
var,仅在调用哈希函数时分配。
其他提示
如果使用构造函数填充所有字段并将字段设为最终字段 - 那么就在那里。
如果字段使用自定义类型 - 您可能还需要使它们不可变。
作为集合的任何字段都应使用不可修改的集合 - 为安全起见。
你需要担心对象图!
对象上的任何方法都需要注意非最终字段。例如。 String.add创建新字符串。如果你需要改变一个字段 - 通过复制构造函数来实现。
最后让对象最终。
不隶属于 StackOverflow