最终与不变是不同的。
final != immutable
所述final
关键字被用于确保基准不会改变(即,它已经不能用新的被取代的参考)
但是,如果属性为self是可修改的,则可以执行您刚刚描述的操作。
例如
class SomeHighLevelClass {
public final MutableObject someFinalObject = new MutableObject();
}
如果我们实例化此类,则将无法为该属性分配其他值,someFinalObject
因为它是final。
因此这是不可能的:
....
SomeHighLevelClass someObject = new SomeHighLevelClass();
MutableObject impostor = new MutableObject();
someObject.someFinal = impostor;
但是,如果对象本身是可变的,则如下所示:
class MutableObject {
private int n = 0;
public void incrementNumber() {
n++;
}
public String toString(){
return ""+n;
}
}
然后,可以更改该可变对象包含的值。
SomeHighLevelClass someObject = new SomeHighLevelClass();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
someObject.someFinal.incrementNumber();
System.out.println( someObject.someFinal );
这与您的帖子具有相同的效果:
public static void addProvider(ConfigurationProvider provider) {
INSTANCE.providers.add(provider);
}
在这里,您没有更改INSTANCE的值,而是在修改其内部状态(通过providers.add方法)
如果要防止应该像这样更改类定义:
public final class ConfigurationService {
private static final ConfigurationService INSTANCE = new ConfigurationService();
private List providers;
private ConfigurationService() {
providers = new ArrayList();
}
....
但是,这可能没有多大意义:)
顺便说一下,出于相同的原因,您还必须基本上同步对其的访问。