java - 为什么要在 Java 中将不可变类声明为 Final?

标签 java immutability final

我读到这个是为了制作 class immutable在Java中,我们应该执行以下操作,

  1. 不提供任何 setter
  2. 将所有字段标记为私有(private)
  3. 将类(class)定为 final类

为什么需要第 3 步?为什么我应该将类标记为final

最佳答案

如果你没有将类标记为final,我可能会突然让你看似不可变的类实际上变得可变。例如,考虑以下代码:

public class Immutable {
     private final int value;

     public Immutable(int value) {
         this.value = value;
     }

     public int getValue() {
         return value;
     }
}

现在,假设我执行以下操作:

public class Mutable extends Immutable {
     private int realValue;

     public Mutable(int value) {
         super(value);
       
         realValue = value;
     }

     public int getValue() {
         return realValue;
     }
     public void setValue(int newValue) {
         realValue = newValue;
     }

    public static void main(String[] arg){
        Mutable obj = new Mutable(4);
        Immutable immObj = (Immutable)obj;              
        System.out.println(immObj.getValue());
        obj.setValue(8);
        System.out.println(immObj.getValue());
    }
}

请注意,在我的 Mutable 子类中,我重写了 getValue 的行为,以读取在我的子类中声明的新的可变字段。因此,您的类最初看起来是不可变的,但实际上并不是不可变的。我可以在任何需要 Immutable 对象的地方传递这个 Mutable 对象,假设该对象确实是不可变的,这可能会对代码造成非常糟糕的影响。将基类标记为 final 可以防止这种情况发生。

关于java - 为什么要在 Java 中将不可变类声明为 Final?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59551744/

相关文章:

java - 无法在 Appcelerator Studio 中构建

java - Java 字符串是如何工作的

rust - 如何使包含 Arc 的结构字段可写?

Java:final 关键字的内存使用情况?

java - 为什么在 Java 中必须将字节上的按位运算强制转换为字节?

java - DeepLearning4j - 神经网络配置

java - AbstractCollection 的目的是什么

c# - 如何在 C# 中使用字符串作为参数的方法

java - 关于Java中局部final变量的问题

java - 内联初始化的最终成员变量不知何故为空