2011-12-05 12 views
5

मेरे enum प्राप्त करने के लिए इस वर्तमान की तरह है?स्थापना enumerations के मूल्यों, और स्ट्रिंग पार्स करने में enum

:

Manufacturers mfg = Manufacturers.Honda; 

mfg.ordinal() // save as key 

यानी मैं भी enumInstance.ordinal()

का उपयोग कर कुंजी स्टोर करेगा, मैं एक स्ट्रिंग जो गणन की क्रमसूचक मूल्य होगा पार्स करने के लिए, और मिल वापस एक enum में सक्षम होना चाहिए

Manufacturers mfg = Manufacturers.valueOf(mfgOrdinalValueAsString); 

उपर्युक्त ने मुझे एक त्रुटि दी (स्ट्रिंग "1" थी)। क्या यह सही तरीका है? मुझे लगता है कि मुझे वहां एक कोशिश/पकड़ होना चाहिए?

उत्तर

2

.valueOf वास्तव में स्ट्रिंग "जीएम" (1 के लिए) की अपेक्षा करेगा।

मानचित्र में अपने enum मूल्यों को संग्रहीत करने के लिए, EnumMap का उपयोग करें जो विशेष रूप से इसके लिए डिज़ाइन किया गया है - और यह भी तेज़ होगा।

यदि आप वास्तव में अपने ordinal द्वारा किसी मान का संदर्भ देना चाहते हैं, तो Manufacturers.values()[1] जैसे कुछ का उपयोग करें।

+0

मैं औपचारिक मूल्य को स्पष्ट रूप से सेट नहीं कर सकता, मैंने कोशिश की: जीएम ("5"), टोयोटा ("6") – Blankman

+1

नहीं, आप उन्हें सेट नहीं कर सकते - ordinals आदेश से मेल खाते हैं मूल्य enum के भीतर घोषित किया जाता है। – ziesemer

+1

यदि किसी कारण से आपको enum के प्रत्येक तत्व (इसके स्वचालित रूप से असाइन किए गए ordinal के अलावा) से जुड़े एक अलग 'int' संख्या की आवश्यकता है, तो आप इसे enum में एक विशेषता के रूप में जोड़ सकते हैं, साथ ही गेटर्स –

2

एक सुझाव: बेहतर name() का प्रयोग कर एक String रूप नाम enum की प्राप्त करने के लिए, और जब भी आप मूल Enum इसे से वापस पाने के लिए की जरूरत है, का उपयोग valueOf() विधि - के बाद से valueOf()नाम उम्मीद नहीं एक पैरामीटर के रूप में, ordinal। उदाहरण के लिए:

enum Example {ONE, TWO}; 

String name = Example.ONE.name(); 
Example e = Example.valueOf(Example.class, name); // e has value ONE 

आप निश्चित रूप से क्रमसूचक का उपयोग करने की जरूरत है, ordinal() विधि एक सूचकांक है जो आप संबंधित Enum सरणी values() विधि द्वारा लौटाए से पुनः प्राप्त करने के लिए उपयोग कर सकते वापस आ जाएगी। इस तरह:

int ordinal = Example.ONE.ordinal(); 
Example e = Example.values()[ordinal]; // e has value ONE 

जैसा कि पहले ही बताया गया है, के रूप में दस्तावेज में कहा गया है EnumMap उपयोग करें, क्योंकि यह

enum प्रकार कुंजी के साथ प्रयोग के लिए एक विशेष नक्शा कार्यान्वयन है। नक्शा बनाया गया है, जब एक enum मानचित्र में सभी कुंजी एक enum प्रकार से आना चाहिए जो निर्दिष्ट, स्पष्ट रूप से या स्पष्ट रूप से निर्दिष्ट है। Enum नक्शे आंतरिक रूप से सरणी के रूप में प्रतिनिधित्व कर रहे हैं। यह प्रतिनिधित्व बेहद कॉम्पैक्ट और कुशल है।

संपादित

आप (अपने स्वचालित रूप से आवंटित क्रमसूचक के अलावा अन्य) enum के प्रत्येक तत्व के लिए एक अलग कोड संबद्ध करने के लिए की जरूरत है, तो आप हमेशा enum करने के लिए एक विशेषता के रूप में यह जोड़ सकते हैं के साथ एक साथ, getters और setters, इस तरह:

public enum Manufacturers { 

    Honda(10), 
    GM(20), 
    Toyota(30), 
    Ferrari(40); 

    private int code; 

    Manufacturers(int code) { 
     this.code = code; 
    } 

    public int getCode() { 
     return code; 
    } 

    public void setCode(int code) { 
     this.code = code; 
    } 

} 

उदाहरण के लिए:

Manufacturers m = Manufacturers.Honda; 
System.out.println(m.getCode()); // prints 10 
m.setCode(100); 
System.out.println(m.getCode()); // prints 100 

बस जागरूक रहें कि आप विशेषता से Enum ऑब्जेक्ट का पुनर्निर्माण करने में सक्षम नहीं होंगे, क्योंकि प्रोग्रामर द्वारा परिभाषित किया गया था।

+0

कैसे करें ताकि आप केवल नाम का उपयोग कर सकते हैं, न कि सामान्य मूल्य? – Blankman

+0

यह सही है, केवल टर्मिनल का उपयोग करके enum को पुनर्प्राप्त करने के लिए, 'मान() 'का उपयोग करें। मैंने कोड के उदाहरणों के साथ अपना जवाब अपडेट किया। –

संबंधित मुद्दे