我是 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/