2011-11-03 4 views
26

में फाइनल के रूप में हैशटेबल बनाना जैसा कि हम जावा में "अंतिम" कीवर्ड का उद्देश्य जानते हैं। चर के रूप में एक चर घोषित करते समय, हमें चर को प्रारंभ करना होगा। जैसे "अंतिम int a = 10;" हम "ए" के मान को नहीं बदल सकते हैं। लेकिन अगर हम हैशटेबल के लिए कुछ मूल्य जोड़ना संभव है तो हैशटेबल को फाइनल के रूप में घोषित करना भी संभव है।जावा

उदाहरण ::

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() 
{{  put("foo",  1);  
     put("bar",  256);  
     put("data",  3);  
     put("moredata", 27);  
     put("hello", 32);  
     put("world", 65536); }}; 

अब मैं अंतिम रूप MYHASH HashTable घोषणा कर रहा हूँ। अगर मैं इसमें कुछ और तत्व जोड़ने की कोशिश करता हूं, तो यह स्वीकार करता है।

MYHASH.put("NEW DATA",  256); 

अब "नया डेटा" हैशटेबल में जोड़ा गया है। मेरे प्रश्न यह है कि क्यों इसे अंतिम रूप में घोषित करने की इजाजत है ????

+0

नोट यदि नक्शे की सामग्री परिवर्तनशील थे ('java.util.Date' या' java.awt.Point', कहते हैं) तो यह अभी भी परिवर्तनशील है। –

उत्तर

63

क्योंकि अंतिम संदर्भ संदर्भ नहीं है, वस्तु नहीं। आप उस संदर्भ बिंदु को किसी भिन्न हैश तालिका में नहीं बना सकते हैं। लेकिन आप चीजों को जोड़ने और हटाने सहित उस वस्तु को कुछ भी कर सकते हैं।

int का आपका उदाहरण एक प्राचीन प्रकार है, संदर्भ नहीं। अंतिम मतलब है कि आप चर के मान को नहीं बदल सकते हैं। तो, int के साथ आप चर के मान को नहीं बदल सकते हैं, उदा। int का मूल्य अलग करें। किसी ऑब्जेक्ट संदर्भ के साथ, आप संदर्भ के मान को नहीं बदल सकते हैं, यानी यह किस ऑब्जेक्ट को इंगित करता है।

0

फ़ील्ड और चर के लिए, final का उपयोग करने का अर्थ है कि उन्हें केवल एक बार असाइन किया जा सकता है। या तो तुरंत, या कुछ समय बाद (जैसे फ़ील्ड के लिए एक निर्माता में)। इसका मतलब यह नहीं है कि वास्तविक उदाहरण अपरिवर्तनीय हो जाता है। एक हैशटेबल एक डेटा संरचना है जिसे आप प्रविष्टियों को जोड़ सकते हैं, भले ही इसे कुछ चर के लिए असाइन किया गया हो। केवल संदर्भ अंतिम है।

6

Collections.unmodifiableMap(MYHASH ) का उपयोग करके एक अप्रचलित मानचित्र के साथ अपने Hashtable को आजमाएं और लपेटें। जब आप मानचित्र में कुछ बदलने की कोशिश करते हैं तो इसे अपवाद फेंकना चाहिए, यानी प्रविष्टियां जोड़ें या हटाएं। (ध्यान दें कि MYHASH तो प्रकार Map<String, String> और नहीं Hashtable<String, String> का होना चाहिए।)

final कीवर्ड के बारे में: के रूप में दूसरों को पहले से ही ने कहा, यह मतलब है कि आप MYHASH के लिए एक और Hashtable असाइन नहीं कर सकते, लेकिन स्वयं मानचित्र अभी भी परिवर्तनशील है। इसे बदलने के लिए आपको ऊपर उल्लिखित UnmodifiableMap जैसे कुछ अपरिवर्तनीय रैपर के साथ लपेटना होगा।

12

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

मानचित्र को अप्रचलित बनाने के लिए Collections.unmodifiableMap(map) का उपयोग करें।

4

जैसा कि जो ने कहा, ऐसा इसलिए है क्योंकि final संदर्भ वस्तु को संदर्भित नहीं करता है।

लेकिन, आप क्या आप Collections.unmodifiableMap साथ चाहते हैं (here देखें)

8

आप Collections.unmodifiableMap उपयोग कर सकते हैं अपने हैश तालिका के ऊपर एक unmodifiable आवरण पाने के लिए कर सकते हैं।

उदाहरण:

import java.util.*; 
class Test{ 

    public static final Map<String,Integer> MYHASH; 
    static{ 
     Hashtable<String,Integer> tmp = 
      new Hashtable<String,Integer>(); 
     tmp.put("A",65); 
     tmp.put("C",67); 
     MYHASH = Collections.unmodifiableMap(tmp); 
    } 

    public static void main(String[] args){ 

     System.out.println(MYHASH.get("A")); 

     //this will throw 
     //java.lang.UnsupportedOperationException 
     MYHASH.put("B",66);  

    } 

} 
+1

आपको मेरा +1 मिलता है क्योंकि आप अनजाने में उत्परिवर्तित होने के बारे में मानचित्र के उत्परिवर्तनीय संस्करण को स्पष्ट रूप से नहीं रखते हैं। अपरिवर्तनीय स्थिर 'निजी' रखना पसंद करेंगे। 'हैशटेबल' का उपयोग करने में भी कोई बात नहीं है। –

+0

धन्यवाद! मैं प्रश्न के साथ स्थिरता के लिए 'हैशटेबल' के साथ गया, लेकिन मैंने 'निजी 'नहीं देखा था। – Vlad

+0

धन्यवाद आपने मेरी समस्या का भी समाधान किया। – bean