【发布时间】:2012-11-18 22:21:26
【问题描述】:
已经阅读了如何通过以下步骤使类不可变
- 不提供“setter”方法——修改字段或字段引用的对象的方法。
- 将所有字段设为最终字段和私有字段。
- 不允许子类覆盖方法。最简单的方法是将类声明为 final。更复杂的方法是将构造函数设为私有并在工厂方法中构造实例。
- 如果实例字段包含对可变对象的引用,请不要更改这些对象:
一种。不要提供修改可变对象的方法。
湾。不要共享对可变对象的引用。永远不要存储对传递给构造函数的外部可变对象的引用;如有必要,创建副本并存储对副本的引用。同样,在必要时创建内部可变对象的副本以避免在方法中返回原始对象。
我不确定我是否清楚地了解私有构造函数和工厂方法在不变性背景下的实用性。如果我将课程定为最终课程,则基本上是关闭扩展它的任何其他课程的所有路径。所说的更复杂的方法如何
我已经看到了单例模式中的私有构造函数、工厂方法,这是有道理的。但是当我们谈到对象不变性时,当我们提到私有构造函数和静态工厂方法时,我们是否也在限制对象构造/实例化??
【问题讨论】:
-
是的。做 (2) 和 (4) 应该足以使实例不可变。执行 (3) 会使类无法扩展(或者至少,任何子类都不能实例化),这是完全不同的。
标签: java singleton immutability