非最终 - 不可变 类

non final - immutable classes

我读过并且一直被告知不可变的 classes 必须是 final 。但我想知道是否有可能将非最终 class 对象作为不可变对象。 在这个 link (Why would one declare an immutable class final in Java?) 中,如果不可变的 class 方法是最终的并且不能被覆盖怎么办。如果 class 的所有成员都是最终的,那么 class 的对象也可以是不可变的(除非它们引用可变对象)。请告诉我是否有误并打勾:)

如果你可以扩展一个不可变的 class(这意味着它不是最终的),你可以向子 class 添加可变属性,这将使你的子 class可变的,因此基础 class 也是可变的,因为它可以有可变的子 classes.

一个不可变的 class 不一定是最终的,但你需要防止它被 subclassed,例如通过没有 public 或受保护的构造函数。

例如,Guava 的 ImmutableList class 不是最终的,但它是不可变的,如 Javadoc 中所述。

为了创建不可变的 class,不必将 class 标记为最终的。

让我举一个这样的例子来自 java classes 本身 "BigInteger" class 是不可变的,但它不是最终的。

Immutability其实是一个概念,对象创建之后就不能修改了。

让我们从 JVM 的角度考虑,从 JVM 的角度来看,所有线程必须共享对象的相同副本,并且在任何线程访问它之前它已经完全构建,并且对象的状态在访问之后不会改变建筑。

不变性意味着一旦创建对象就无法更改对象的状态,这是通过三个经验法则实现的,这些规则使编译器认识到 class 是不可变的,它们如下: -

所有非私有字段都应该是最终的 确保 class 中没有可以直接或间接更改对象字段的方法 class 中定义的任何对象引用都不能在 class 之外修改 更多信息请参考下面URL

http://javaunturnedtopics.blogspot.in/2016/07/can-we-create-immutable-class-without.html