我是Java的新手,正在尝试学习定义不可变对象的概念。我已经在Java教程oracle中读到了创建不可变对象的方法之一
不允许子类覆盖方法。最简单的方法是将类声明为final。
我的问题是,为什么不允许子类重写方法会导致创建不可变对象?我在努力理解这里的联系。
答案 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());
}
}