java - 为什么不允许子类覆盖方法会导致创建不可变对象(immutable对象)?

标签 java overriding subclass immutability final

我是 Java 的新手,正在尝试学习定义不可变对象(immutable对象)的概念。我在 Java 教程 oracle 中读到,创建不可变对象(immutable对象)的方法之一是

Don't allow subclasses to override methods. The simplest way to do this is to declare the class as final.

我的问题是,为什么不允许子类覆盖方法会导致创建不可变对象(immutable对象)?我很难理解这里的联系。

最佳答案

假设 String 的方法可以由另一个类扩展。不能保证其他类像 String 一样是不可变的。

因此,如果您调用某个库方法并返回一个 String,该 String 是否会改变?是 String 基类还是扩展它的东西是可变的? String 是最终类,所以我们不必担心。

我在下面举了一个混淆的例子:

public class WhyImmutableClassesShouldBeFinal {
    /*
     * This is an immutable class
     */
    private static class ImmutableClass {
        private final String data;

        public ImmutableClass(String data) {
            this.data = data;
        }

        public String getData() {
            return data;
        }
    }

    /*
     * This extends an immutable class, but is not immutable.
     */
    private static class NotSoImmutableClass extends ImmutableClass {
        private int oops;

        public NotSoImmutableClass() {
            super("WHATEVER");
        }

        public String getData() {
            return Integer.toString(oops++);
        }
    }

    /*
     * Here's some function that looks like it returns an immutable class but
     * doesn't.
     */
    private static ImmutableClass immutableClassProducer() {
        return new NotSoImmutableClass();
    }

    public static void main(String[] args) {
        /*
         * I called a method and got an ImmutableClass back.
         */
        ImmutableClass c = immutableClassProducer();

        /*
         * But why is the value changing?
         */
        System.out.println(c.getData());
        System.out.println(c.getData());
        System.out.println(c.getData());
        System.out.println(c.getData());
    }
}

关于java - 为什么不允许子类覆盖方法会导致创建不可变对象(immutable对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35518507/

相关文章:

java - 调用一个方法从文件中读取数据

java - 在实例中运行并在再次运行前停止 5 分钟的代码

java - 尝试从 url 下载图像时,出现缓冲区容量错误

java - 无法重写 Vaadin ComboBox 的 getValue() 方法

iphone - 从静态 TableView 中获取标题标题

带有类型参数的 Java 类

java - 扩展通用父级时的值转换

javascript - jquery oop 覆盖方法函数

html - CSS 继承 - 为什么 'later' 声明被 'earlier' 声明覆盖?

inheritance - Golang : when typecasting child struct to parent struct, 子结构信息丢失?