我读到要在Java中制作class immutable,我们应该执行以下操作,

  • 不提供 setter
  • 将所有字段标记为私有(private)
  • 使类(class)最终成为

  • 为什么需要步骤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的行为以读取在我的子类中声明的新的可变字段。结果,您的类(最初看起来是不可变的)实际上并不是不可变的。我可以在需要Mutable对象的任何地方传递此Immutable对象,假设该对象确实是不可变的,这可能会做非常不好的事情。标记基类final可以防止这种情况的发生。

    希望这可以帮助!

    10-06 14:38