我正在寻找一种有效的方法来构建一个不可变的类,就像Java的String类一样。
答案 0 :(得分:8)
private
,最好是final
Collections.unmodifiable*
。此外,集合应仅包含不可变对象 Tom Hawtin指出final
可以是可选的。 String
class
有一个缓存hash
var,仅在调用哈希函数时分配。
答案 1 :(得分:1)
如果对象不能被修改,则该对象是不可变的,因此这些字段必须是final
。如果您不希望对象被子类化,那么您也可以使类本身final
,就像String一样。
要轻松构造包含大量信息的不可变对象,您应该查看Factory Pattern
有关详细信息,请参阅Wikipedia
答案 2 :(得分:1)
如果使用构造函数填充所有字段并将字段设为最终字段 - 那么就在那里。
如果字段使用自定义类型 - 您可能还需要使它们不可变。
作为集合的任何字段都应使用不可修改的集合 - 为安全起见。
你需要担心对象图!
对象上的任何方法都需要注意非最终字段。例如。 String.add创建新字符串。如果你需要改变一个字段 - 通过复制构造函数来实现。
最后让对象最终。