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

咖啡 :

在我的Java访谈问答列表中,它表​​示,在Java中,您可以通过三种方式使对象不可变。方式之一是:

通过将类定为final(严格不变性)或将方法定为final(弱不变性),确保方法不能被覆盖。

与将类定为final相比,将方法定为final的不变性如何呢?另外,强不变性和弱不变性是什么意思?

奥利弗·查尔斯沃斯(Oliver Charlesworth):

因为Liskov替换原理指出,可以在需要超类实例的任何地方替换子类实例,而无需从调用者的角度更改语义。子类可能会引入可变的行为,从而违反LSP。

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

例如,基于不变性假设,调用方框架可能不会在多线程方案中使用克隆或使用同步。当将其应用于可变子类时,这将引起主要问题,但不是由于对超类接口的任何语义更改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章