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



与将类设为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/

10-12 02:21