最终状态并不等同于不可变。
final != immutable
关键字用于确保引用未更改(即,它具有的引用不能替换为新引用)final
但是,如果属性是 self 是可修改的,则可以执行您刚才描述的操作。
例如
class SomeHighLevelClass {
    public final MutableObject someFinalObject = new MutableObject();
}
如果我们实例化此类,我们将无法为该属性分配其他值,因为它是最终值。someFinalObject
所以这是不可能的:
....
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);
}
在这里,您没有更改实例的值,而是修改其内部状态( via, providers.add method )
如果你想防止类定义应该像这样改变:
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 :) 
....
但是,它可能没有多大意义:)
顺便说一句,出于同样的原因,您还必须同步对它的访问。