最终化不等于不可变。
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; // not allowed because someFinal is .. well final
但是,如果它自己的对象是这样可变的:
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 ); // prints 3
这与您的帖子具有相同的效果:
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();
}
// Avoid modifications
//public static void addProvider(ConfigurationProvider provider) {
// INSTANCE.providers.add(provider);
//}
// No mutators allowed anymore :)
....
但是,这可能没有多大意义:)
顺便说一句,出于同样的原因,您基本上还必须同步对它的访问。