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

有帮助吗?

解决方案

  1. 所有字段必须是 private ,最好是 final
  2. 确保课程不能 被覆盖 - 让课程最终, 或使用静态工厂并保持 建设者私人
  3. 必须填写字段 构造/工厂
  4. 不要为此提供任何制定者 字段
  5. 留意收藏品。使用 <代码> Collections.unmodifiable * 。此外,集合应仅包含不可变对象
  6. 所有吸气剂必须提供 不可变对象或使用防御性复制
  7. 不提供任何方法 改变了内部的状态 对象。
  8. Tom Hawtin 指出 final 可以是可选的。 String class 有一个缓存 hash var,仅在调用哈希函数时分配。

其他提示

如果使用构造函数填充所有字段并将字段设为最终字段 - 那么就在那里。

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

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

你需要担心对象图!

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

最后让对象最终。

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

有关详情,请参阅维基百科

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top