2012-10-26 18 views
8

अगर मैं एक वर्ग जहां Synapse एक सार प्रकार है के भीतर निम्न कथन है:अंतिम कीवर्ड के साथ एक सूची क्षेत्र घोषित

private final List<Synapse> synapses; 

final मुझे अभी भी Synapse वस्तुओं की स्थिति बदलने के लिए सक्षम होने की अनुमति है List में है, लेकिन मेरे सूची में नए Synapse वस्तुओं जोड़ने से रोक? अगर मैं गलत हूँ, तुम क्या final कर रही है और जब मैं कीवर्ड final बजाय का उपयोग करना चाहिए के बारे में समझाएं सकता है।

उत्तर

20

नहीं है, अंतिम कीवर्ड सूची नहीं है, या इसकी सामग्री अपरिवर्तनीय। आप एक अपरिवर्तनीय सूची चाहते हैं, आप का उपयोग करना चाहिए:

List<Synapse> unmodifiableList = Collections.unmodifiableList(synapses); 

क्या अंतिम कीवर्ड करता है 'synapses' चर के लिए एक नया मान निर्दिष्ट करने से रोक रहा है। यानी, आप नहीं लिख सकते हैं:

final List<Synapse> synapses = createList(); 
synapses = createNewList(); 

हालांकि, आप लिख सकते हैं:

List<Synapse> synapses = createList(); 
synapses = createNewList(); 
+7

यह उनका कहना है कि हालांकि कुछ भी नहीं जोड़ा जा सकता है, हटाया, या 'unmodifiableList' इस तरह का निर्माण में बदल दिया लायक है, सूची के तत्वों अभी भी अपने राज्य को बदल दिया हो सकता है (अगर वे कर रहे हैं परिवर्तनशील)। सूची घोषणा या निर्माण के बारे में कुछ भी इसे रोक सकता है। –

+0

तो आप कर सकते हैं: 'अंतिम सूची synapses = createList();' और फिर 'synapses.add (newSynapse()) '? तो इसका मतलब है कि 'synapses' किसी अन्य चीज़ को इंगित नहीं कर सकता है लेकिन यह सूची सही है? –

+0

@ एविएरा हां, ठीक है, जब तक 'synapses' एक म्यूटेबल ऑब्जेक्ट है जैसे ArrayList। –

4

final आप से रोकता हैsynapses फिर नियत करने के बाद उसे एक बार सौंपा गया है - आप अभी भी जोड़ सकते हैं/आप सामान्य रूप से तत्व निकाल सकते हैं। आप final कीवर्ड here के बारे में और अधिक पढ़ सकते हैं।

2

आप अभी भी बदल सकते हैं जोड़ सकते हैं और सूची की सामग्री को हटा दें, लेकिन चर करने के लिए आवंटित एक नई सूची नहीं बना सकते।

2

जावा भाषा विशिष्टता writes:

एक चर अंतिम घोषित किया जा सकता। एक अंतिम चर केवल एक बार असाइन किया जा सकता है। एक परिवर्तनीय फाइनल घोषित करना उपयोगी दस्तावेज़ीकरण के रूप में कार्य कर सकता है कि इसका मूल्य नहीं बदलेगा और प्रोग्रामिंग त्रुटियों से बचने में मदद कर सकता है।

यह एक संकलित-समय त्रुटि है यदि अंतिम चर निर्दिष्ट किया जाता है जब तक कि यह असाइनमेंट से तुरंत पहले असाइन नहीं किया जाता है (§16)।

एक खाली अंतिम एक अंतिम चर जिसका घोषणा एक प्रारंभकर्ता का अभाव है।

एक बार एक अंतिम चर सौंपा गया है, यह हमेशा एक ही मूल्य में शामिल है। यदि कोई अंतिम चर किसी ऑब्जेक्ट का संदर्भ रखता है, तो ऑब्जेक्ट की स्थिति ऑब्जेक्ट पर ऑपरेशन द्वारा बदला जा सकता है, लेकिन चर हमेशा एक ही ऑब्जेक्ट को संदर्भित करेगा।

इसलिए, यदि आप को लागू करने की है कि राज्य चर माध्यम से पहुंच योग्य नहीं बदलता है चाहते हैं तो आपको चर final घोषित, एक unmodifiable सूची (उदाहरण के लिए Collections.unmodifiableList के साथ) का उपयोग करें, और Synapse वस्तुओं अपरिवर्तनीय करना है।

1

अंतिम कार्यान्वयन का अर्थ है कि ऑब्जेक्ट संदर्भ एक बार शुरू हुआ, संदर्भ स्वयं कभी नहीं बदला जा सकता है लेकिन सामग्री निश्चित रूप से हो सकती है। यह नियमों का उल्लंघन नहीं कर रहा है। आपने संदर्भ परिवर्तन के बारे में केवल एक नियम निर्दिष्ट किया है जो तदनुसार काम कर रहा है। यदि आप चाहते हैं कि मूल्यों को कभी भी नहीं बदला जाना चाहिए तो आपको अपरिवर्तनीय सूचियों के लिए जाना चाहिए I।ई

List<String> items = Collections.unmodifiableList(Arrays.asList("a", "b", "c")); 

निम्नलिखित संबंधित प्रश्न देखें।