您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

为什么要用Java声明一个不变的类final?

为什么要用Java声明一个不变的类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可以防止这种情况的发生。

java 2022/1/1 18:14:24 有716人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶