2012-09-28 4 views
29

यह प्रश्न मूल रूप से मेरे previous question का विस्तार है। मैंने पिछले प्रश्न से यह सुनिश्चित करने के लिए कहा कि वर्ग लोड होने पर एनम स्थिरांक आबादी वाले होते हैं। यहाँ मेरी कक्षा एक सरल विधि getByName के अलावा के साथ फिर से है:java.lang.IllegalArgumentException का कारण क्या है: मूल्यों के माध्यम से पुनरावृत्ति होने के बावजूद कोई enum const class() ठीक काम करता है?

public enum PropName { 

    CONTENTS("contents"), 
    USE_QUOTES("useQuotes"), 
    ONKEYDOWN("onkeydown"), 
    BROWSER_ENTIRE_TABLE("browseEntireTable"), 
    COLUMN_HEADINGS("columnHeadings"), 
    PAGE_SIZE("pageSize"), 
    POPUP_TITLE("popupTitle"), 
    FILTER_COL("filterCol"), 
    SQL_SELECT("sqlSelect"), 
    ; 

    private String name; 

    private PropName(String name) { 
    this.name = name; 
    } 

    public String getName() { 
    return name; 
    } 

    public static PropName getByName(String name){ 
    return PropName.valueOf(name); 
    } 
} 

एक कॉल विधि getByName("columnHeadings") करने के लिए java.lang.IllegalArgumentException: No enum const class labware.web.component.limsgrid.PropName.columnHeadings फेंक रहा है, लेकिन अगर मैं निम्न कोड के साथ इस पद्धति की जगह यह सिर्फ काम करता है।

public static PropName getByName(String name){ 
    for(PropName prop : values()){ 
     if(prop.getName().equals(name)){ 
     return prop; 
     } 
    } 

    throw new IllegalArgumentException(name + " is not a valid PropName"); 
    } 

कोई विचार क्या मैं यहां गलत कर रहा हूं?

+4

आपको वास्तव में अपने नाम में "नाम" नाम की एक संपत्ति को परिभाषित नहीं करना चाहिए। आपके पास नाम() और getName() अलग-अलग मान लौटाएंगे ... –

उत्तर

49

Enum.valueOf() केवल स्थिर नाम की जांच करता है, इसलिए आपको इसे "कॉलमहेडिंग्स" के बजाय "COLUMN_HEADINGS" पास करना होगा। आपकी name संपत्ति के पास Enum internals से कोई लेना देना नहीं है।

+0

क्या होगा यदि आपको उस तरह से मैप करने की आवश्यकता है? आपके पास कहीं और से "कॉलमहेडिंग" आ रही है और कोड में COLUMN_HEADINGS enum के रूप में इसका उपयोग करने की आवश्यकता है? – Ville

7

ऐसा इसलिए है क्योंकि आपने अपने enum के लिए name का अपना संस्करण परिभाषित किया है, और getByName इसका उपयोग नहीं करता है।

getByName("COLUMN_HEADINGS") शायद काम करेगा।

1
निर्धारित करने के बजाय

: COLUMN_HEADINGS("columnHeadings")

के रूप में यह परिभाषित करने का प्रयास करें: COLUMNHEADINGS("columnHeadings")

फिर जब आप getByName(String name) method कहते हैं, यह ऊपरी मामलों स्ट्रिंग इस तरह के साथ फोन: getByName(myStringVariable.toUpperCase())

मैं एक ही समस्या थी जैसा कि आप, और यह मेरे लिए काम किया।

+0

यह बल आपको बिल्कुल (केसिनेन्सिव) समान enum नाम और संपत्ति मान है। – Jon

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

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