使对象不可变的可能方法
我正在寻找一种有效的方法来构建一个不可变的类,就像Java的String类一样。
- 所有字段必须是
private
,最好是final
- 确保不能覆盖类 – 使类最终,或使用静态工厂并保持构造函数私有
- 必须从构造函数/工厂填充字段
- 不要为字段提供任何setter
- 留意collections品。 使用
Collections.unmodifiable*
。 此外,集合应仅包含不可变对象 - 所有getter必须提供不可变对象或使用防御性复制
- 不提供任何更改Object的内部状态的方法。
Tom Hawtin指出final
可以是可选的。 String
class
有一个缓存hash
var,仅在调用哈希函数时分配。
如果使用构造函数填充所有字段并将字段设为最终字段 – 那么您就在那里。
如果字段使用自定义类型 – 您可能还需要使它们不可变。
作为集合的任何字段都应使用不可修改的集合 – 为安全起见。
你需要担心对象图!
对象上的任何方法都需要注意非final字段。 例如,String.add创建一个新的 String。 如果你需要改变一个字段 – 通过复制构造函数这样做。
最后使对象最终。
如果一个对象都不能被修改,那么该对象是不可变的,因此这些字段必须是final
。 如果你不希望你的对象被子类化,你可以使类本身也是final
,就像String一样。 要轻松构造包含大量信息的不可变对象,您应该查看工厂模式
有关更多信息,请参阅Wikipedia