2012-12-09 26 views
54

मुझे एक enum घोषित करने में परेशानी हो रही है। जो मैं बनाने की कोशिश कर रहा हूं वह 'डाउनलोड टाइप' के लिए एक enum है, जहां 3 डाउनलोड प्रकार हैं (ऑडियो, वीडियो, AUDIO_AND_VIDEO)।जावा एनम रिटर्न Int

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 
} 

यह ठीक काम करता है अगर मैं तो इस तरह इसका इस्तेमाल:

DownloadType.AUDIO_AND_VIDEO.value; 

हालांकि, मैं यह चाहते हैं ताकि मेरे पास नहीं है

मैं इस प्रकार कोड लागू किया है 'मूल्य' के लिए पूछने के लिए। मैं गलत हो सकता है, लेकिन इस तरह से कई वर्गों में इस तरह के फ़ॉन्ट को जावा में काम करते हैं, उदाहरण के एक फ़ॉन्ट शैली स्थापित करने के लिए के लिए, आप का उपयोग करें:

Font.PLAIN 

कौन सा एक पूर्णांक मान देता है, हम का उपयोग नहीं करते:

Font.PLAIN.value 
+1

आप बस डाउनलोडटाइप का उपयोग कर सकते हैं।AUDIO_AND_VIDEO तब तक जब तक आपको मूल्य की आवश्यकता न हो, क्या मुझे कुछ याद आ रहा है? – kosa

+0

@ नंबरी अगर मैं System.out.println (DownloadType.AUDIO_AND_VIDEO) यह "AUDIO_AND_VIDEO" देता है जो स्पष्ट रूप से 'डाउनलोड टाइप' प्रकार का है, int नहीं। – Cristian

+2

मुझे लगता है कि आप enums के उद्देश्य को भ्रमित कर रहे हैं। आपको पूर्णांक की आवश्यकता क्यों है? – Jivings

उत्तर

86

Font.PLAINनहीं एक enum है। यह सिर्फ int है। यदि आपको एनम से मूल्य लेने की आवश्यकता है, तो आप किसी विधि को कॉल करने या .value का उपयोग करने से नहीं बच सकते हैं, क्योंकि वास्तव में enums वास्तव में अपने स्वयं के प्रकार की वस्तुएं हैं, प्राइमेटिव नहीं।

आप वास्तव में केवल एक int, और की जरूरत है आप पहले से ही है कि प्रकार-सुरक्षा उपयोगकर्ता खो दिया है अपने एपीआई के लिए अवैध मान पास कर सकते स्वीकार करने के लिए, आप int भी रूप में उन स्थिरांक को परिभाषित कर सकते हैं:

static class DownloadType { 
    public static final int AUDIO = 0; 
    public static final int VIDEO = 1; 
    public static final int AUDIO_AND_VIDEO = 2; 
} 

वैसे, value क्षेत्र वास्तव में अनावश्यक भी एक .ordinal() विधि है क्योंकि वहाँ है, तो आप निर्धारित कर सकते हैं enum के रूप में:

enum DownloadType { AUDIO, VIDEO, AUDIO_AND_VIDEO } 

और "मूल्य"

DownloadType.AUDIO_AND_VIDEO.ordinal() 
+0

स्पष्टीकरण के लिए धन्यवाद देने के लिए धन्यवाद, यह अब समझ में आता है। एक enum बनाने के बजाय, मैं एक सार्वजनिक DownloadType {निजी स्थिर अंतिम int AUDIO = 0; } ... क्या यह एक इनर क्लास होना चाहिए? आपके उत्तर के लिए धन्यवाद। – Cristian

+0

@ क्रिस्टियन: यह मुख्य रूप से इस बात पर निर्भर करता है कि आप इसे कैसे एक्सेस करना चाहते हैं। – kennytm

+0

आपके उत्तरों के लिए धन्यवाद, वही था जो मैं खोज रहा था - – Cristian

38

आप पूर्णांक मान प्राप्त करने की जरूरत है, तो बस अपने enum में मूल्य के लिए एक गेटर है:

private enum DownloadType { 
    AUDIO(1), VIDEO(2), AUDIO_AND_VIDEO(3); 
    private final int value; 

    private DownloadType(int value) { 
     this.value = value; 
    } 

    public int getValue() { 
     return value; 
    } 
} 

public static void main(String[] args) { 
    System.out.println(DownloadType.AUDIO.getValue());   //returns 1 
    System.out.println(DownloadType.VIDEO.getValue());   //returns 2 
    System.out.println(DownloadType.AUDIO_AND_VIDEO.getValue()); //returns 3 
} 

या आप कर सकते थे सरल उपयोग ordinal() विधि है, जो enum की स्थिति वापसी होगी सह enumant में nstant।

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    //rest of the code 
} 

System.out.println(DownloadType.AUDIO.ordinal());   //returns 0 
System.out.println(DownloadType.VIDEO.ordinal());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.ordinal()); //returns 2 
+2

आपको अतिरिक्त विधि की आवश्यकता क्यों है जब आप आसानी से कॉल कर सकते हैं .value और पूर्णांक प्राप्त करने के लिए पहले से ही एक विधि ordinal() प्रदान किया गया है। – kosa

+0

@ नंबरी umm, dint पता enum ordinal है .. मेरे बारे में कितना बेवकूफ है: पी – PermGenError

+0

@GanGnaMStYleOverFlowErroR उत्तर के लिए धन्यवाद, लेकिन मैं वास्तव में कॉलिंग से बचने के लिए देख रहा था .value, अकेले एक और तरीका बनाने और getValue() :) – Cristian

10

का उपयोग कर, बस, एक enum मूल्य पर ordinal() विधि कॉल उसके संगत संख्या को पुनः प्राप्त करने के लिए मिलता है। इसके मूल्य के साथ एक अतिरिक्त विशेषता घोषित करने की कोई आवश्यकता नहीं है, प्रत्येक गणना मूल्य को डिफ़ॉल्ट रूप से अपना स्वयं का नंबर मिलता है, जो शून्य से शुरू होता है, उसी क्रम में प्रत्येक मान के लिए एक द्वारा बढ़ाया जाता है।

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

प्रश्न में प्रदान किए गए उदाहरण के बारे में, Font.PLAIN काम करता है क्योंकि यह केवल फ़ॉन्ट वर्ग का पूर्णांक स्थिरांक है।यदि आपको बिल्कुल (संभावित रूप से बदलते) संख्यात्मक कोड की आवश्यकता है, तो enum नौकरी के लिए सही उपकरण नहीं है, संख्यात्मक स्थिरांक के लिए बेहतर छड़ी है।

+1

का कारण बन सकता है मुझे ordinal() के बारे में पता है, लेकिन अगर मैं भविष्य में एक अलग क्रम को बदलना या निर्दिष्ट करना चाहता हूं, तो इससे समस्याएं पैदा हो जाएंगी। मैं int मान – Cristian

+1

@ क्रिस्टियन निर्दिष्ट करना चाहता हूं, आपको केवल अपने वास्तविक मूल्य पर, enum के int मान पर निर्भर नहीं होना चाहिए। जावा में एन्म्स सी में enums की तरह नहीं हैं, जहां आप उनके पूर्णांक कोड पर निर्भर करते हैं। –

+0

@ क्रिस्टियन और आपके द्वारा दिए गए उदाहरण के बारे में 'Font.PLAIN' काम करता है क्योंकि यह सिर्फ 'फ़ॉन्ट' वर्ग का पूर्णांक स्थिरांक है। यदि आपको पूरी तरह से (संभावित रूप से बदलते) संख्यात्मक कोड की आवश्यकता है, तो नौकरी के लिए 'enum' सही उपकरण नहीं है, संख्यात्मक स्थिरांक के लिए बेहतर छड़ी है। –

3

आप एक स्ट्रिंग आप toString विधि ओवरराइड कर सकते हैं के साथ enum श्रृंखलाबद्ध रहे हैं, तो पूर्णांक वापस जाने के लिए:

public String toString() { 
    return value + ""; 
} 

तो फिर तुम बस इस्तेमाल कर सकते हैं:

String something = "foo" + DownloadType.AUDIO; 

और toString() विधि होगा बुलाया जाना


ध्यान दें कि प्रोग्रामिंग रूप से टूस्ट्रिंग() प्रोग्रामेटिक रूप से खराब अभ्यास माना जाता है - यह केवल मानव आंखों के लिए है, हालांकि आप जो पूछ रहे हैं उसे प्राप्त करने का यही एकमात्र तरीका है।

+0

महान काम-आसपास, धन्यवाद! 'ToString()' को इंगित करने के लिए – Cristian

10

सबसे पहले आपको निम्नलिखित प्रश्न पूछना चाहिए: क्या आपको वास्तव में एक int की आवश्यकता है?

enums का उद्देश्य वस्तुओं (संग्रह) का संग्रह होना है, जिसका बाहरी मूल्य (जैसे int) पर भरोसा किए बिना कोड में अर्थ है। जावा में एनम्स को स्विच स्टेटमेंट्स पर एक तर्क के रूप में इस्तेमाल किया जा सकता है और उन्हें "==" समानता ऑपरेटर (दूसरों के बीच) का उपयोग करके सुरक्षित रूप से तुलना की जा सकती है।

प्रस्ताव 1 (कोई पूर्णांक आवश्यक):

अक्सर इसके पीछे एक पूर्णांक के लिए कोई जरूरत नहीं है।

private enum DownloadType{ 
    AUDIO, VIDEO, AUDIO_AND_VIDEO 
} 

//... 

DownloadType downloadType = MyObj.getDownloadType(); 
if (downloadType == DownloadType.AUDIO) { 
    //... 
} 
//or 
switch (downloadType) { 
    case AUDIO: //... 
      break; 
    case VIDEO: //... 
      break; 
    case AUDIO_AND_VIDEO: //... 
      break; 
} 

प्रस्ताव 2 (int आवश्यक):

फिर भी कभी कभी यह किसी पूर्णांक के लिए एक enum कन्वर्ट करने के लिए उपयोगी हो सकता है (उदाहरण के लिए यदि एक बाहरी एपीआई पूर्णांक मूल्यों की उम्मीद है)। इस मामले में मैं toXxx()-स्टाइल का उपयोग करके विधियों को रूपांतरण विधियों के रूप में चिह्नित करने की सलाह दूंगा। मुद्रण के लिए toString() ओवरराइड करें।

private enum DownloadType { 
    AUDIO(0), VIDEO(1), AUDIO_AND_VIDEO(2); 
    private final int code; 

    private DownloadType(int code) { 
     this.code = code; 
    } 

    public int toInt() { 
     return code; 
    } 

    public String toString() { 
     //only override toString, if the returned value has a meaning for the 
     //human viewing this value 
     return String.valueOf(code); 
    } 
} 

System.out.println(DownloadType.AUDIO);     //returns 0 
System.out.println(DownloadType.AUDIO.name());   //returns AUDIO 
System.out.println(DownloadType.VIDEO.toInt());   //returns 1 
System.out.println(DownloadType.AUDIO_AND_VIDEO.toInt()); //returns 2 

सारांश

  • एक enum के साथ एक साथ एक पूर्णांक का उपयोग आप के लिए नहीं है, तो मत करो।
  • एनम के पूर्णांक प्राप्त करने के लिए ordinal() का उपयोग करने पर भरोसा न करें, क्योंकि यदि आप कोई अन्य एनम स्थिर जोड़ते हैं या ऑर्डर बदलते हैं तो यह मान बदल सकता है।
  • आम तौर पर enums (जैसे स्वीकृत उत्तर में) के बजाय int स्थिरांक का उपयोग न करें, क्योंकि आप टाइप-सुरक्षा खो देंगे (जैसा कि @ केनीटीएम उल्लेख किया गया है)।
+0

+1 हालांकि int int स्ट्रिंग बन जाता है और मैं इसके कारण इसका उपयोग नहीं कर रहा हूं :) –

4

आप इस कोड को आजमा सकते हैं।

private enum DownloadType { 
    AUDIO , VIDEO , AUDIO_AND_VIDEO ; 

} 

आप इस तरह के रूप में इस गणना का उपयोग कर सकते हैं: DownloadType.AUDIO.ordinal()। आशा है कि यह कोड स्निपेट आपकी मदद करेगा।

3

क्या आप यह कोड चाहते हैं?

public static enum FieldIndex { 
    HDB_TRX_ID,  //TRX ID 
    HDB_SYS_ID  //SYSTEM ID 
} 

public String print(ArrayList<String> itemName){ 
    return itemName.get(FieldIndex.HDB_TRX_ID.ordinal()); 
} 
संबंधित मुद्दे