【问题标题】:non final - immutable classes非 final - 不可变类
【发布时间】:2015-01-25 12:32:50
【问题描述】:

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

【问题讨论】:

    标签: java immutability final


    【解决方案1】:

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

    【讨论】:

    • 好的,这种情况可以是创建具有不可变父引用的子类对象。现在参考指向的实际上是可变的。我说的对吗?
    【解决方案2】:

    不可变类不一定是最终类,但您需要防止它被子类化,例如没有公共或受保护的构造函数。

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

    【讨论】:

      【解决方案3】:

      对于创建不可变类,不必将类标记为最终类。

      让我从 java 类本身中举一个这样的例子,“BigInteger”类是不可变的,但不是最终的。

      其实不可变性是一个概念,对象创建后就不能被修改。

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

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

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

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

      【讨论】:

      • 请注意,禁止过度宣传自己的博客;见help center
      猜你喜欢
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多