최종적인 것은 불변하는 것과 다릅니다.
final != immutable
final
키워드는 반드시 참조가 변경되지 않습니다를 만드는 데 사용됩니다 (즉,이 새 것으로 대체 할 수있다 참조)
그러나 속성 자체가 수정 가능한 경우 방금 설명한대로 수행해도됩니다.
예를 들어
class SomeHighLevelClass {
public final MutableObject someFinalObject = new MutableObject();
}
이 클래스를 인스턴스화하면 finalsomeFinalObject
이기 때문에 속성에 다른 값을 할당 할 수 없습니다 .
따라서 이것은 불가능합니다.
....
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의 값을 변경하지 않고 내부 상태를 수정합니다 (via, provider.add 메소드).
클래스 정의가 다음과 같이 변경되는 것을 방지하려면 :
public final class ConfigurationService {
private static final ConfigurationService INSTANCE = new ConfigurationService();
private List providers;
private ConfigurationService() {
providers = new ArrayList();
}
....
그러나 그것은별로 의미가 없을 수도 있습니다. :)
그건 그렇고, 기본적으로 같은 이유로 액세스를 동기화 해야합니다 .