java - Java 中的强不变性与弱不变性?

标签 java

在我的 Java 面试问答列表中,它说,在 Java 中,您可以通过三种方式使对象不可变。其中一种方式是:

Ensure that methods can't be overridden by either making the class final (Strong Immutability) or making your methods final (Weak immutability).

为什么将方法设置为 final 被认为比将类设置为 final 更不可变?另外,强不变性和弱不变性是什么意思?

最佳答案

因为 Liskov Substitution Principle指出子类实例可以在任何需要父类(super class)实例的地方被替换,而不会从调用者的角度改变语义。子类可能会引入可变行为,从而违反 LSP。

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

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

关于java - Java 中的强不变性与弱不变性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31772872/

相关文章:

java - 如何从java中的字符串中删除\"?

java - Java中的回调是同步的吗?

java - 如何在 Eclipse 中使用带有 gwt 的 chrome 扩展 api?

java - 在 android 中设置背景颜色时设置动画

java - JFrame:在构造函数中更改值后,字符串更改回 null

java - 无法使用和停止线程

java - Weblogic如何发送带有Unicode字符集的页面

java - Brent Aurelie Flappy Bird 教程后的播放按钮高度

java - MongoDB atlas,连接不工作

java - Activity 调度算法设计,最大化 Activity 数量