Tho*_*hor 4 java overriding final subclass immutability
我是Java新手,正在尝试学习定义不可变对象的概念.我已经在Java教程oracle中读到了创建不可变对象的方法之一
不允许子类重写方法.最简单的方法是将类声明为final.
我的问题是,为什么不允许子类重写方法会导致创建不可变对象?我在努力理解这里的联系.
小智 5
假设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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |