2012-04-10 19 views
5

मैं एक हैश मैप बनाने के लिए एक तरीका ढूंढ रहा हूं जो मिश्रित प्रकारों के लिए मानचित्र बनाता है।जावा मैपिंग मिश्रित प्रकार

उदाहरण के लिए, निम्नलिखित पायथन में काम करते हैं (ध्यान दें कि एक अजगर dict एक जावा HashMap के समान है) होगा:

d = dict() 
d["str"] = "This is a string" 
d["flt"] = 1.23 
d["int"] = 5 

और जब d[x] एक्सेस करते समय, उचित प्रकार लौटा दिया जाएगा (स्ट्रिंग, नाव, इस उदाहरण में int)।

जावा में, मैं HashMap<String, Object> के साथ जा सकता हूं, लेकिन मेरे पास वास्तव में यह बताने का कोई तरीका नहीं है कि प्रत्येक ऑब्जेक्ट किस प्रकार है।

तो इसके बजाय, मैं वर्तमान में ऐसा करने की कोशिश कर रहा हूं MixedType कक्षा है जिसमें ऑब्जेक्ट है, लेकिन इसकी मूल प्रकार की जानकारी भी है, ताकि मैं इसे बाद में घटा सकूं। उदाहरण के लिए:

public class MixedMap 
    public static class MixedType 
    { 
     public Class<?> cls; 
     public Object val; 

     public MixedType(Class<?> c, Object v) 
     { 
      this.cls = c; 
      this.val = v; 
     } 
    } 

    public static void main(String args[]) 
    { 
     MixedType m1 = new MixedType(String.class, "This is a String"); 
     System.out.println((m1.cls)m1.val); 
    } 
} 

नोट इस मैं :-) करने के लिए के रूप में यह वर्तमान में शिकायत की कि m1 cannot be resolved to a type संकलन नहीं कर रहा है कोशिश कर क्या कर रहा हूँ है।

तो मेरा सवाल यह है कि, मैं इसे कैसे ठीक कर सकता हूं? एक ही लक्ष्य को प्राप्त करने के अन्य तरीकों का स्वागत किया जाएगा, लेकिन कृपया मुझे यह बताने का जवाब न दें कि यह संकलक की प्रकार की जांच क्षमता को सीमित करता है - मुझे पता है और इसके साथ ठीक है।

अग्रिम धन्यवाद।

+2

क्या मैं अभी पूछ सकता हूं: एक बार पुनर्प्राप्त किए जाने के बाद आप वस्तुओं के साथ क्या करेंगे? मुझे लगता है कि आम तौर पर इसे कास्ट करने से बचने के लिए इसे डिजाइन करने का एक बेहतर तरीका है। –

+1

भले ही आपके पास अपने सादे 'ऑब्जेक्ट्स' में संग्रहीत प्रकार की जानकारी हो, फिर भी आप यह जानने की उम्मीद कैसे करते हैं कि उन्हें डालने के बाद क्या करना है? –

+0

निश्चित रूप से, मैं हैश मैप का उपयोग "कॉन्फ़िगरेशन" प्रकार ऑब्जेक्ट के रूप में करूँगा, जहां उपयोगकर्ता कुछ कॉन्फ़िगरेशन सेटिंग्स निर्दिष्ट करेगा जिन्हें पार्स किया जाएगा और इस मानचित्र में रखा जाएगा। कार्यक्रम में कुछ बिंदुओं पर मैं यह देखने के लिए जांच करूंगा कि कोई निश्चित कॉन्फ़िगरेशन विकल्प सेट है या नहीं, यदि इसका उपयोग करें और डिफ़ॉल्ट का उपयोग न करें। मिश्रित प्रकारों की आवश्यकता का कारण यह है कि कुछ कॉन्फ़िगरेशन विकल्प स्ट्रिंग होंगे, अन्य फ्लोट्स, अन्य इन्ट्स इत्यादि। – jedwards

उत्तर

6

करने के लिए उचित बात m1.cls.cast(m1.val) है, लेकिन आप निश्चित रूप से सादे Map<String, Object> की तुलना में कुछ भी हासिल नहीं करेंगे। एक आसान तरीका जो आपको उतनी ही अधिक सुरक्षा और बिल्कुल वही जानकारी प्राप्त करेगा - जो कहने के लिए, ज्यादा नहीं - केवल getClass() विधि का उपयोग अपने मानचित्र में Object मानों पर करना होगा।

इनमें से कोई भी String value = map.get("str") कहने में सक्षम होने का लक्ष्य पूरा नहीं करेगा - एक पूर्ण कलाकार से कम कुछ भी ऐसा नहीं करेगा। आप

Object value = map.get("str"); 
if (value instanceof String) { 
    // do stringy things 
} 

या उन पंक्तियों के साथ कुछ कर सकते हैं।

यदि आप संकलन समय पर उनके उपयोग बिंदुओं पर मूल्यों के प्रकारों को जानते हैं, तो अब तक का सबसे अच्छा समाधान आगे बढ़ना है और उपयोग बिंदुओं पर कास्ट करना है। सामान्य रूप से कॉन्फ़िगरेशन करने का "आदर्श" तरीका Map का उपयोग नहीं करना है, लेकिन एक अनुकूलित Configuration कक्षा बनाने के लिए जो अपने फ़ील्ड और उनके प्रकार को संकलित समय पर जानता है, लेकिन यदि आप Map का उपयोग करना चाहते हैं, तो बस सीधे रहता है शायद आपकी सबसे अच्छी शर्त है।

+0

कई वैकल्पिक समाधानों के लिए धन्यवाद! – jedwards

1

मैंने पहले इस तरह कुछ लागू किया है। आप सहायता के लिए जेनेरिक का उपयोग कर सकते हैं। आप जो चाहते हैं वह MixedKey है, जिसे आप MixedMap में कुंजी के रूप में उपयोग कर सकते हैं। इन पंक्तियों के साथ कुछ:

public class MixedKey<T> { 
    public final Class<T> cls; 
    public final String key; 

    public MixedKey(T cls, String key) { 
     this.key = key; 
     this.cls = cls; 
    } 

    // also implement equals and hashcode 
} 

public class MixedMap extends HashMap<MixedKey<?>,Object> { 
    public <T> T putMixed(MixedKey<T> key, T value) { 
     return key.cls.cast(put(key, value)); 
    } 

    public <T> T getMixed(MixedKey<T> key) { 
     return key.cls.cast(get(key)); 
    } 
} 

कुछ इस तरह करने के बारे में अच्छी बात यह है कि अगर आप गलती से गलत प्रकार का उपयोग करें तो यह आपको एक संकलन समय त्रुटि दे देंगे, कुछ आप सीधे कास्टिंग के साथ नहीं मिलता है:

MixedKey<Integer> keyForIntProperty 
    = new MixedKey<Integer>(Integer.class, "keyForIntProperty"); 

// ... 

String str = mixedMap.getMixed(keyForIntProperty); // compile-time error 

बनाम

String str = (String)map.get("keyForIntProperty"); // run-time error only 
संबंधित मुद्दे