java中类的不可变性

java中类的不可变性,java,immutability,Java,Immutability,类的不变性是否仅取决于其字段 如果一个类的成员类未标记为final,但标记为“static class”,并且该内部类的成员也是final、、、并且封闭外部类的所有字段都标记为final,那么外部类的不变性将如何描述?否,这不取决于 从更广泛的意义上讲,如果任何时候的所有方法调用都返回相同的结果,则类是不可变的 一个很好的例子是java.lang.String类,当您第一次调用hashcode()时,hashcode字段会发生更改,但返回的结果是相同的 更严格的解释是,初始化后不能更改任何字段。

类的不变性是否仅取决于其字段


如果一个类的成员类未标记为final,但标记为“static class”,并且该内部类的成员也是final、、、并且封闭外部类的所有字段都标记为final,那么外部类的不变性将如何描述?

否,这不取决于

从更广泛的意义上讲,如果任何时候的所有方法调用都返回相同的结果,则类是不可变的

一个很好的例子是
java.lang.String
类,当您第一次调用
hashcode()
时,
hashcode
字段会发生更改,但返回的结果是相同的


更严格的解释是,初始化后不能更改任何字段。例如,可以通过不声明公共setter和避免类内的任何更改来实现。另一种方法是——正如您所提到的——将字段声明为
final。

不变性是一个通用术语,没有具体定义。例如,如果类有一个最终列表字段,它是不可变的吗?列表在某些情况下可以修改,所以实际上它不是不可变的类。我认为这是一个更具哲理的讨论,而不是一个具体的讨论。请注意,类是final与不变性几乎没有关系。那么像“调度器”这样的类呢,它有返回
void
的方法
调度
。它是不变的吗?我喜欢wiki的定义:“在面向对象和函数式编程中,不可变对象是一个状态在创建后无法修改的对象。”这里还有另一个术语“状态”也有模糊的定义:)是的,如果
调度器
不提供
getScheduledJobs()
或任何类似方法,其结果在调用
schedule()
后会发生变化,则该方法可能被视为不可变的。但我故意将状态排除在答案之外,因为这会导致不同的解释(对象内的状态或其他对象内的状态、线程等)