2012-09-28 13 views
29

この質問は基本的に私のprevious questionの拡張です。前回の質問では、クラスが読み込まれたときにEnum定数が設定されていることを確認しました。ここにある私のクラスは、簡単な方法getByNameの添加で再びです:java.lang.IllegalArgumentExceptionの理由は何ですか:values()を反復処理しても問題ありませんが、enum constクラスはありません。

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

実際には、enumに "name"という名前のプロパティを定義しないでください。別の値を返すname()とgetName()があります... –

答えて

49

Enum.valueOf()は定数名のみをチェックするので、 "columnHeadings"の代わりに"COLUMN_HEADINGS"を渡す必要があります。 nameプロパティはEnum内部とは関係ありません。

+0

これを正確にマッピングする必要がある場合はどうなりますか?あなたは "columnHeadings"を別の場所から取得していて、コード内でCOLUMN_HEADINGS列挙型として使用する必要がありますか? – Ville

7

あなたのenumに独自のバージョンnameが定義されており、getByNameはそれを使用していないからです。

getByName("COLUMN_HEADINGS")はおそらく動作します。

1

代わりの定義:あなたはgetByName(String name) methodを呼び出すときに、このような大文字に文字列でそれを呼び出し、その後COLUMNHEADINGS("columnHeadings")

::私は同じ問題を抱えていたgetByName(myStringVariable.toUpperCase())

COLUMN_HEADINGS("columnHeadings")

のようにそれを定義してくださいあなたのように、これは私のために働いた。

+0

これは、厳密に(大文字と小文字を区別しない)同じenum名とプロパティ値を強制的に持ちます。 – Jon

関連する問題