为什么不允许子类重写方法可以导致创建不可变对象?

时间:2016-02-20 02:45:52

标签: java override subclass immutability final

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

  

不允许子类覆盖方法。最简单的方法是将类声明为final。

我的问题是,为什么不允许子类重写方法会导致创建不可变对象?我在努力理解这里的联系。

1 个答案:

答案 0 :(得分:5)

假设字符串的方法可以被另一个类扩展。不能保证其他类不像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());
    }
}