2009-07-29 14 views
5

हमारे पूरे प्रोजेक्ट में, हमारे पास इस तरह के enums हैं। वे ठीक काम करते हैं, लेकिन हम उनके बारे में निश्चित नहीं हैं।मेरा गणन सही है?

विशेष रूप से getDocumentType (स्ट्रिंग) विधि के साथ।

क्या सभी Enums फ़ील्ड पर पुनरावृत्ति से बचने का कोई तरीका है?

public enum DocumentType { 

    UNKNOWN("Unknown"), 
    ANY("Any"), 
    ASSET(Asset.class.getSimpleName()), 
    MEDIA(Media.class.getSimpleName()), 
    MEDIA35MM(Media.class.getSimpleName() + " 35mm"); 


    private String label; 

    private DocumentType(String label) { 
     this.label = label; 
    } 

    public String getLabel() { 
     return label; 
    } 

    public static DocumentType getDocumentType(String label){ 
     for(DocumentType documentType : DocumentType.values()){ 
      if(documentType.getLabel().equals(label)){ 
       return documentType; 
      } 
     } 
     return UNKNOWN; 
    } 
} 

संपादित करें: newacct प्रतिक्रिया की जाँच करें। वह भी ठीक है।

+1

यह उदाहरणों Enum के लिए लेबलों की स्थिर मानचित्र स्टोर करने के लिए होती है, लेकिन frustratingly, जावा आप एक enum के निर्माता से एक स्थिर क्षेत्र का संदर्भ नहीं दूँगा। – skaffman

+1

मुझे आश्चर्य है कि आप "संपत्ति" लिखने के बजाय Asset.class.getSimpleName() का उपयोग क्यों करते हैं? क्या आप रीफैक्टरिंग द्वारा नाम बदलने की योजना बना रहे हैं? – akarnokd

+1

क्योंकि तारों के बजाय वर्ग अक्षर का उपयोग करना हमेशा अच्छा अभ्यास है? – skaffman

उत्तर

5

आपको लिखने वाले enums में प्रतिबंधों के कारण कहीं भी पुनरावृत्ति करना होगा। एक आदर्श दुनिया में, आप दस्तावेज़ प्रकार के कन्स्ट्रक्टर के भीतर से एक स्थिर मानचित्र तैयार करेंगे, लेकिन इसकी अनुमति नहीं है।

सबसे अच्छा मैं कर सकते हैं सुझाव एक लुकअप तालिका में एक स्थिर प्रारंभकर्ता में एक बार यात्रा प्रदर्शन कर रहा है, और भंडारण enums:

public enum DocumentType { 

    .... existing enum stuff here 

    private static final Map<String, DocumentType> typesByLabel = new HashMap<String, DocumentType>(); 
    static { 
     for(DocumentType documentType : DocumentType.values()){ 
      typesByLabel.put(documentType.label, documentType); 
     } 
    } 

    public static DocumentType getDocumentType(String label){ 
     if (typesByLabel.containsKey(label)) { 
      return typesByLabel.get(label); 
     } else { 
      return UNKNOWN; 
     } 
    } 
} 

कम से कम आप यात्रा हर बार कर नहीं किया जाएगा, हालांकि मैं संदेह है कि आप कोई सार्थक प्रदर्शन सुधार देखेंगे।

+0

+1 बस मैं क्या सोच रहा था, तुमने मुझे हराया हालांकि यह =) – mikek

+1

मैंने कंपाइलर – skaffman

+0

पर बस 10 मिनट या तो चिल्लाया है अगर enum (या हजारों) में 100 तत्व हैं तो यह एक प्रदर्शन सुधार हो सकता है ...हो सकता है, खासकर अगर आप इन्हें बहुत देख रहे हैं। – aperkins

1

जहां तक ​​मुझे पता है (इसके लिए क्या लायक है), यह वही करने का सबसे अच्छा तरीका है जो आप चाहते हैं।

इस प्रकार मैं कम से कम ऐसा करूंगा।

अपने enum गिनती काफी बढ़ता है (कुछ सौ - हजारों) आप enums को Strings के Map आईएनजी जोड़ने के लिए एक छोटे से तेजी से लुक-अप करने के लिए कर सकते हैं। लेकिन आपके पास eunums की छोटी राशि के लिए, यह अधिक हो सकता है।

1

मुझे ठीक लग रहा है।

मैं पुनरावृत्ति को छोड़ दूंगा। निश्चित रूप से आप नक्शा < 'लेबल', 'दस्तावेज़ टाइप'> एनम कक्षा में कार्यान्वयन जोड़ सकते हैं और एक लुकअप कर सकते हैं लेकिन यह प्रदर्शन में काफी वृद्धि नहीं करेगा।

1

तार संकलन समय पर जाना जाता है, तो कर रहे हैं, और अगर वे वैध पहचानकर्ता हैं, तो आप सिर्फ enums सीधे के नाम के रूप में उपयोग कर सकते हैं:

public enum DocumentType { Unknown, Any, Asset, Media, Media35mm } 

और फिर .valueOf() से समझ गया। उदाहरण के लिए:

String label = "Asset"; 
DocumentType doctype; 
try { 
    doctype = DocumentType.valueOf(label); 
} catch (IllegalArgumentException e) { 
    doctype = DocumentType.Unknown; 
} 
+0

एक सहयोगी एक ही समाधान के साथ आ रहा था। यह ज्यादातर समय के लिए ठीक है, हमारे सटीक मामले में नहीं, लेकिन अगले पुनरावृत्ति के लिए यह जांच करेगा कि क्या हम वास्तव में एक पहचानकर्ता और लेबल को नीच करते हैं। –

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