强大的不变性与Java中的弱不变性?

时间:2015-08-02 14:28:14

标签: java

在Java访谈Q& A列表中,它说,在Java中,您可以通过三种方式使对象不可变。其中一种方法是:

  

确保无法通过创建类来覆盖方法   最终(强不可变性)或使你的方法最终(弱)   不变性)。

如何让最终制作方法比制作最终版本更不可变?另外,强不变性和弱不变性意味着什么?

2 个答案:

答案 0 :(得分:17)

因为Liskov Substitution Principle表明子类实例可以在预期超类实例的任何地方被替换,而不会从调用者的角度改变语义。子类可能会引入可变行为,从而违反了LSP。

一方面,最终方法(和私有成员变量)限制了直接通过超类接口看到的改变语义的范围。另一方面,可变子类可能会间接引入违规行为。

例如,基于不变性假设,调用者框架可能不会在多线程场景中克隆或使用同步。当应用于可变子类时,这会导致重大问题,但不会由于超类接口的任何语义更改而导致。

答案 1 :(得分:0)

使类最终确保您不能将其子类化,这意味着该类未打开以进行扩展。不变性不是关于保存对象的初始状态,而是确保不存在行为改变。

但是如果一个类没有标记为final,那么总是有可能对它进行子类化并改变它的实现,我们知道父引用可以引用一个子对象。所以有可能违反不变性。