2014-10-22 5 views
6

जावा में संग्रह को अंतिम घोषित करने का क्या अर्थ है? क्या यह है कि इसमें कोई और तत्व जोड़ा जा सकता है? क्या यह है कि पहले से मौजूद तत्वों को बदला नहीं जा सकता है? क्या यह कुछ और है?जावा में संग्रह को अंतिम रूप देने के लिए इसका क्या अर्थ है?

+2

इसका मतलब है कि यह संदर्भ (सूची का) बदला नहीं जा सकता – MadProgrammer

+0

यह भी देखें: [अंतिम ऐरेलिस्ट की भावना क्या है?] (http://stackoverflow.com/q/10750791/697449), [सूची फ़ील्ड को घोषित करना अंतिम कीवर्ड] (http://stackoverflow.com/q/13079365/697449), [जावा अंतिम संशोधक] (http://stackoverflow.com/q/4012167/697449) –

उत्तर

7

नहीं। इसका मतलब यह है कि संदर्भ बदला नहीं जा सकता है।

final List list = new LinkedList(); 

.... 
list.add(someObject); //okay 
list.remove(someObject); //okay 
list = new LinkedList(); //not okay 
list = refToSomeOtherList; //not okay 
3

आप अंतिम और अपरिवर्तनीय वस्तुओं के बीच उलझन में हो रहे हैं।

final -> आप संग्रह (ऑब्जेक्ट) में संदर्भ को नहीं बदल सकते हैं। आप को संदर्भ/ऑब्जेक्ट संदर्भ बिंदुओं को संशोधित कर सकते हैं। आप अभी भी संग्रह

immutable -> को संदर्भ/ऑब्जेक्ट संदर्भ सामग्री की सामग्री को संशोधित नहीं कर सकते हैं। आप संग्रह में तत्व नहीं जोड़ सकते हैं।

1

आप ऐसा नहीं कर सकते, संदर्भ, FINAL

final ArrayList<Integer> list = new ArrayList<Integer>(); 
    ArrayList<Integer> list2 = new ArrayList<Integer>(); 
    list=list2;//ERROR 
    list = new ArrayList<Integer>();//ERROR 

JLS 4.12.4

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

1
चर अंतिम सुनिश्चित करना कि बाद उसके असाइन आप नहीं पुन: असाइन कर सकते हैं कि वस्तु संदर्भ बनाता है

। आप च Collections.unmodifiableList के उपयोग के साथ अंतिम कीवर्ड गठबंधन, आप जीई behavi

final List fixedList = Collections.unmodifiableList(someList); 

यह है के रूप में परिणाम है कि सूची में से fixedList बदला नहीं जा सकता इशारा किया। यह अभी भी someList संदर्भ के माध्यम से बदल किया जा सकता है (ताकि यकीन है कि यह इस asignment के बाद क्षेत्र से बाहर है या नहीं।)

अधिक सरल उदाहरण एक HashSet में इंद्रधनुष के रंगों को मिलाकर एक इंद्रधनुष वर्ग ले जा रहा है

public static class Rainbow { 
    /** The valid colors of the rainbow. */ 
    public static final Set VALID_COLORS; 

    static { 
     Set temp = new HashSet(); 
     temp.add(Color.red); 
     temp.add(Color.orange); 
     temp.add(Color.yellow); 
     temp.add(Color.green); 
     temp.add(Color.blue); 
     temp.add(Color.decode("#4B0082")); // indigo 
     temp.add(Color.decode("#8A2BE2")); // violet 
     VALID_COLORS = Collections.unmodifiableSet(temp); 
    } 

    /** 
    * Some demo method. 
    */ 
    public static final void someMethod() { 
     Set colors = RainbowBetter.VALID_COLORS; 
     colors.add(Color.black); // <= exception here 
     System.out.println(colors); 
    } 
    } 
} 
संबंधित मुद्दे