2016-08-28 6 views
3

次のコードはなぜ例外をスローしますか?列挙型の値を変更する

私は列挙型の値を永続化する必要があります。データベースの列挙型の値を永続化するためのベストプラクティスは、小文字の文字列リテラルとして格納することです。

public enum Type { 

SWIPE_BUTTON("swipe_button"), DROP_DOWN("drop_down"), RADIO_BUTTON("radio_button"), CHECK_BOX("check_box"); 

private final String label; 

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

public String getValue() { 
    return label; 
} 

@Override 
public String toString() { 
    return getValue(); 
} 

public static Type getEnum (String value) { 

    for (Type type : values()) 
     if (type.getValue().equals(value)) return type; 

    throw new IllegalArgumentException("invalid value for type"); 
} 

public static void main (String[] args) { 

    System.out.println(Type.valueOf("swipe_button")); 
} 
} 

このアプローチは、hereです。私は基本的にvalueOfメソッドをオーバーライドしようとしていたよう

UPDATE

が見える、と答えは、そうすることができないからです。私はこのメソッドをオーバーライドしようとしていたので、JPAデータベースマッパーがデータベースからエンティティオブジェクトを自動的に移入しようとすると、大文字小文字のリテラル(データベース内)を大文字のenum定数に変換できます。私は列挙型を名前そのもの(すなわち大文字)で永続させることをレトルトします。

+1

「swipe_button」という名前のTypeインスタンスが存在しないためです。しかし、SWIPE_BUTTONという名前のものがあります。 –

+0

なぜあなたはそれを呼び出すつもりがない場合、 'getEnum'を定義するのが難しいですか? –

+0

これは 'Type.valueOf(" SWIPE_BUTTON ")' – NageN

答えて

2

は私が列挙値を永続化する必要がある、と私は

その複雑なアプローチの必要はありませんが...推測してい

代わりに行う

public enum Type { 

SWIPE_BUTTON, DROP_DOWN, RADIO_BUTTON, CHECK_BOX; 
} 

のようなものとの名前を取得列挙子の定数(つまり、最後に必要なもの)

の代わりにを保存します。

+0

は小文字か、データベースでまだ大文字にされていますか? –

+0

これはenumで定義されているものと同じです... 名前は文字列ですので、小文字が必要な場合は*** Type.name()を使用できますtoLowerCase()*** –

+0

もう1つの複雑な点は、クライアントがDBに書き込むことです。エンティティオブジェクトは 'Enum.valueOf'を直接使用するSpringのMongoDBマッパーを使用します。 –

1

Enum.valueOfは、割り当てられた文字列では機能しないため、名前は大文字であるため、Type.valueOf("SWIPE_BUTTON")を使用する必要があります。

おそらくType.getEnum("swipe_button")を意味します。

1

あなたが列挙型は、その名前の上に構築されていることがわかります

for (Type t : values()) { 
    System.out.println("t name:" + t. name()); 

のような可能性enum定数を、反復します。

注意:文字列から列挙型を構築するには、すべて種類の列挙型を使用する必要があります。したがって、メカニズム全体は各列挙定数の固定プロパティに基づいています - それは...よく、その名前になります。

したがって:その魔法の "valueOf()"メソッドを使用する場合は、この方法とその背後にある魔法が実際に使用するというルールに従わなければなりません。