अंतिम होना अपरिवर्तनीय होने के समान नहीं है।
final != immutable
final
कीवर्ड यकीन संदर्भ बदल नहीं है बनाने के लिए प्रयोग किया जाता है (यह है कि, संदर्भ यह एक नया एक के साथ प्रतिस्थापित नहीं किया जा सकता है)
लेकिन, यदि विशेषता स्व है, तो यह परिवर्तन योग्य है कि आपने अभी जो वर्णन किया है वह करना ठीक है।
उदाहरण के लिए
class SomeHighLevelClass {
public final MutableObject someFinalObject = new MutableObject();
}
यदि हम इस वर्ग को तुरंत बदल देते हैं, तो हम विशेषता को अन्य मान निर्दिष्ट नहीं कर पाएंगे someFinalObject
क्योंकि यह अंतिम है ।
तो यह संभव नहीं है:
....
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 का मूल्य नहीं बदल रहे हैं, आप इसकी आंतरिक स्थिति को संशोधित कर रहे हैं (के माध्यम से, प्रदाता। विधि)
यदि आप यह रोकना चाहते हैं कि कक्षा की परिभाषा को इस तरह बदला जाना चाहिए:
public final class ConfigurationService {
private static final ConfigurationService INSTANCE = new ConfigurationService();
private List providers;
private ConfigurationService() {
providers = new ArrayList();
}
....
लेकिन, यह बहुत मतलब नहीं हो सकता है :)
वैसे, आपको मूल रूप से उसी कारण से उस तक पहुंच को सिंक्रनाइज़ करना होगा ।