3

Enum では、values() メソッドはどのように機能しますか?

values() メソッドの背後にあるロジックは何ですか?

私のプロジェクトでは、次のようにすべての列挙型データを Map にキャッシュします。

public enum Actions {
CREATE("create"),
UPDATE("update"),
DELETE("delete"),
ACTIVE("active"),
INACTIVE("inactive"),
MANAGE_ORDER("manage"),
;


private static Map<String, Actions> actionMap;
static {
    actionMap = new HashMap<String, Actions>(values().length);
    for(Actions action : values()) {
        actionMap.put(action.getName(), action);
    }
}

public static Actions fromName(String name) {
    if(name == null) 
        throw new IllegalArgumentException();
    return actionMap.get(name);
}
private String name;

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

public String getName() {
    return name;
}

}

これは enum を使用するためのベスト プラクティスですか?

4

2 に答える 2

7

Enum では、values() メソッドはどのように機能しますか?

Oracle のチュートリアルを読む:

enum 宣言は、クラス (enum 型と呼ばれます) を定義します。enum クラス本体には、メソッドやその他のフィールドを含めることができます。コンパイラは、列挙型を作成するときに、いくつかの特別なメソッドを自動的に追加します。たとえば、宣言されている順序で列挙型のすべての値を含む配列を返す静的値メソッドがあります。このメソッドは、列挙型の値を反復処理するために、for-each コンストラクトと組み合わせて一般的に使用されます。

もう 1 つの注意点は、enum をキーとして使用する場合は、EnumMapを使用することをお勧めします。

列挙型キーで使用するための特別な Map 実装。列挙型マップ内のすべてのキーは、マップの作成時に明示的または暗黙的に指定された単一の列挙型から取得する必要があります。列挙型マップは、内部的に配列として表されます。この表現は非常にコンパクトで効率的です。

于 2013-07-30T14:15:22.967 に答える
2

素晴らしい練習ではありません。とは別に、MANAGE_ORDERすべてのがらくたを次のように置き換えることができます。

public static Action fromName(String name) {
    try {
        return valueOf(name.toUpperCase());
    } catch (IllegalArgumentException e) {
        return null;
    } 
}

nameまた、すべての列挙型には暗黙的に以下があるため、フィールドに名前を付けるのは適切ではありません。

public String name();

列挙定数名を文字列として返します。

于 2013-07-30T14:18:59.893 に答える