非最终 - 不可变类

时间:2015-01-25 12:32:51

标签: java immutability final

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

3 个答案:

答案 0 :(得分:5)

如果你可以扩展一个不可变类(这意味着它不是最终的),你可以在子类中添加可变属性,这会使你的子类可变,因此基类也是可变的,因为它可以有可变的子类。

答案 1 :(得分:4)

不可变类并不一定需要是最终的,但是你需要阻止它被子类化,例如没有公共或受保护的建设者。

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

答案 2 :(得分:-1)

对于创建不可变类,不必将该类标记为final。

让我从java类本身中选择一个这样的例子" BigInteger" class是不可变的,但它不是最终的。

实际上,不变性是一个概念,根据该概念创建的对象然后它不能被修改。

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

不变性意味着一旦创建对象就无法改变对象的状态,这是通过三个拇指规则实现的,这使得编译器能够识别出类是不可变的,它们如下: -

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

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