在Java访谈Q& A列表中,它说,在Java中,您可以通过三种方式使对象不可变。其中一种方法是:
确保无法通过创建类来覆盖方法 最终(强不可变性)或使你的方法最终(弱) 不变性)。
如何让最终制作方法比制作最终版本更不可变?另外,强不变性和弱不变性意味着什么?
答案 0 :(得分:17)
因为Liskov Substitution Principle表明子类实例可以在预期超类实例的任何地方被替换,而不会从调用者的角度改变语义。子类可能会引入可变行为,从而违反了LSP。
一方面,最终方法(和私有成员变量)限制了直接通过超类接口看到的改变语义的范围。另一方面,可变子类可能会间接引入违规行为。
例如,基于不变性假设,调用者框架可能不会在多线程场景中克隆或使用同步。当应用于可变子类时,这会导致重大问题,但不会由于超类接口的任何语义更改而导致。
答案 1 :(得分:0)
使类最终确保您不能将其子类化,这意味着该类未打开以进行扩展。不变性不是关于保存对象的初始状态,而是确保不存在行为改变。
但是如果一个类没有标记为final,那么总是有可能对它进行子类化并改变它的实现,我们知道父引用可以引用一个子对象。所以有可能违反不变性。