2012-04-17 6 views
10

मेरे पास दो अलग-अलग enums हैं और मैं आउटपुट करने में सक्षम होना चाहता हूं कि दिया गया स्ट्रिंग एक enum संग्रह का हिस्सा है।यह जांचने के लिए कि क्या दिया गया स्ट्रिंग जावा में दिए गए एनम का हिस्सा है या नहीं?

public class Check { 
    public enum Filter{SIZE, DATE, NAME}; 
    public enum Action{COPY, DELETE, REMOVE}; 

    public boolean isInEnum(String value, Enum e){ 
     // check if string value is a part of a given enum 
     return false; 
    } 

    public void main(){ 
     String filter = "SIZE"; 
     String action = "DELETE"; 
       // check the strings 
     isInEnum(filter, Filter); 
     isInEnum(action, Action); 
    } 
} 

ग्रहण का कहना है कि अंतिम दो पंक्तियों में लेकिन अलग से ऐसा लगता है कि "फिल्टर एक चर को हल नहीं किया जा सकता है" कि समारोह "isInEnum" में Enum परम गलत है: यह मेरा कोड है ।

कोई भी बहुत गलत है यहां कोई मदद कर सकता है?

public <E extends Enum<E>> boolean isInEnum(String value, Class<E> enumClass) { 
    for (E e : enumClass.getEnumConstants()) { 
    if(e.name().equals(value)) { return true; } 
    } 
    return false; 
} 

और फिर आप isInEnum(filter, Filter.class) फोन:

+0

आपको यह सही मिला है :) enum सिर्फ एक नियमित वर्ग है, आप इसके नाम का उल्लेख नहीं कर सकते हैं। Enum mebers उनके enum के उदाहरण हैं, पूरी तरह से enum नहीं। –

उत्तर

20

सरल (और आमतौर पर सबसे कुशल) जिस तरह से इस प्रकार है।

+0

'enumClass.getMethod (" valueOf ", String.class) .invoke (शून्य, मान) 'के बारे में कैसे? –

+1

यह चाल है लेकिन वाक्यविन्यास पागल है .. उन जेनेरिकों के बारे में कुछ सीखने की आवश्यकता है – Tom

+1

@ मार्कोटोपॉलिकिक जब आप तत्वों के माध्यम से लूपिंग करते हैं तो प्रतिबिंब का उपयोग क्यों करें और आप इसके बजाय 'e.valueOf (value)' का उपयोग कर सकते हैं। यह भी ध्यान दें कि मूल्य का उपयोग करते समय अगर आपको 'IllegalArgumentException' पकड़ना है, तो नाम मौजूद नहीं है और स्ट्रिंग शून्य होने पर 'NullPointerException' है – Ozzy

0

सत्यापन करने के लिए लूप का उपयोग करने से बचें।

मैं valueOf का उपयोग करने का सुझाव दूंगा। यह विधि enums के लिए अंतर्निहित है, और संकलन समय अनुकूलन के लिए विचार किया जा सकता है।

यह लुकअप को अनुकूलित करने के लिए एक स्थिर Map<String,EnumType> लागू करने जैसा ही होगा, एक अन्य विचार जो आप ले सकते हैं।

दोष यह है कि आपको गैर-मूल्य मान को पकड़ने के लिए अपवाद हैंडलिंग तंत्र का उपयोग करना होगा।

उदाहरण

public enum DataType { 
    //... 
    static public boolean has(String value) { 
    if (value== null) return false; 
    try { 
     // In this implementation - I want to ignore the case 
     // if you want otherwise ... remove .toUpperCase() 
     return valueOf(value.toUpperCase()); 
    } catch (IllegalArgumentException x) { 
     // the uggly part ... 
     return false; 
    } 
    } 
} 

भी ध्यान रखें कि ऊपर उल्लिखित प्रकार कार्यान्वयन के साथ, अपने कोड अधिक स्वच्छ दिखता है जब बुला। आपका मुख्य अब कुछ ऐसा दिखाई देगा:

public void main(){ 
    String filter = "SIZE"; 
    String action = "DELETE"; 

    // ... 

    if (Filter.has(filter) && Action.has(action)) { 
     // Appropriate action 
    } 
} 

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

public enum Command { 
    DELETE("del","rm","remove"), 
    COPY("cp"), 
    DIR("ls"); 

    private static final Map<String,Command> ALIAS_MAP = new HashMap<String,Command>(); 
    static { 
    for (Command type:Command.values()) { 
     ALIAS_MAP.put(type.getKey().toUpper(),type); 
     for (String alias:type.aliases) ALIAS_MAP.put(alias.toUpper(),type); 
    } 
    } 

    static public boolean has(String value) { 
    return ALIAS_MAP.containsKey(value.toUpper()); 
    } 

    static public Command fromString(String value) { 
    if (value == null) throw new NullPointerException("alias null"); 
    Command command = ALIAS_MAP.get(value); 
    if (command == null) throw new IllegalArgumentException("Not an alias: "+value); 
    return command; 
    } 

    private List<String> aliases; 
    private Command(String... aliases) { 
    this.aliases = Arrays.asList(aliases); 
    } 
} 
+0

अपवादों से ओवरहेड के बारे में टिप्पणी पोस्ट नोट करें। जब मैंने पहली बार पोस्ट किया था तो वे मुझसे छिपाए गए थे। – YoYo

+0

मैं एक और समान विषय देख रहा था। एक उपयोगकर्ता ने उल्लेख किया कि इस तरह के मामले में जेआईटी कंपाइलर अपवाद ओवरहेड को अनुकूलित करेगा। ओवरहेड केवल सभी साधनों के कारण डीबगिंग करते समय ध्यान देने योग्य है। – YoYo

4

लुइस वासरमैन के उत्तर का जावा 8/स्ट्रीम संस्करण यहां है। (आप भी Enum वर्ग में सीधे इस विधि डाल सकते हैं, और मानकों में से एक को हटा दें)

public boolean isInEnum(String value, Class<E> enumClass) { 
    return Arrays.stream(enumClass.getEnumConstants()).anyMatch(e -> e.name().equals(value)); 
    } 
2

मैं पर्याप्त अंक नहीं हैं सीधे साइमन टॉवर के जवाब पर टिप्पणी करने से, लेकिन यहाँ पल के लिए विधि है जिस तरह से वह उल्लेख किया है कि सीधे enum वर्ग अपने आप में चला जाता है:

public static boolean isInEnum(String value) { 
    return Arrays.stream(EnumClassNameGoesHere.values()).anyMatch(e -> e.name().equals(value)); 
} 
8

आप उपयोग कर अपाचे कॉमन्स lang3 पुस्तकालय आप निम्नलिखित कोड का उपयोग कर सकते कोई आपत्ति नहीं है:

EnumUtils.isValidEnum(Filter.class, filter) 

docs के अनुसार:

इस विधि Enum.valueOf (java.lang.Class, java.lang.String) से अलग है कि वह गलत enum नाम के लिए एक अपवाद फेंक नहीं है।