2011-04-01 179 views
10

由於每個實例都與某個值相關聯的枚舉:如何將值映射回枚舉?

public enum SQLState 
{ 
    SUCCESSFUL_COMPLETION("00000"), 
    WARNING("01000"); 

    private final String code; 
    SQLState(String code) 
    { 
    this.code = code; 
    } 
} 

我如何構建高效的反查起坐地圖嗎?我嘗試了以下方法:

public enum SQLState 
{ 
    SUCCESSFUL_COMPLETION("00000"), 
    WARNING("01000"); 

    private final String code; 
    private static final Map<String, SQLState> codeToValue = Maps.newHashMap(); 
    SQLState(String code) 
    { 
    this.code = code; 
    codeToValue.put(code, this); // problematic line 
    } 
} 

但是Java抱怨:​​。也就是說,靜態地圖正在初始化之後的所有枚舉值,所以你不能從構造函數中引用它。有任何想法嗎?

回答

13

使用:

static { 
    for (SQLState sqlState : values()){ 
    codeToValue.put(sqlState.code, sqlState); 
    } 
} 
+5

有關JLS中的規範示例,請參閱http://java.sun.com/docs/books/jls/third_edition/html/classes.html#324268 – 2011-04-01 15:42:34

0

的構造函數之前初始化靜態地圖靜態{...}塊。查找靜態初始化塊。

1

當您使用的番石榴,我建議使用下面的代碼:

public enum SQLState { 

    SUCCESSFUL_COMPLETION("00000"), 
    WARNING("01000"), 
    ; 

    private final String code; 
    private SQLState(String code) { 
     this.code = code; 
    } 

    public static final Function<SQLState,String> EXTRACT_CODE = new Function<SQLState,String>() { 
     @Override 
     public String apply(SQLState input) { 
      return input.code; 
     } 
    }; 

    public static final Map<String, SQLState> CODE_TO_VALUE = ImmutableMap.copyOf(Maps.uniqueIndex(EnumSet.allOf(SQLState.class), EXTRACT_CODE)); 

    public static void main(String[] args) { 
     System.out.println(SQLState.CODE_TO_VALUE.get("00000")); 
    } 

} 

這將產生預期:「SUCCESSFUL_COMPLETION」

使用靜態初始化是好的,當你無法初始化最後的變量內聯,但在這種情況下,與番石榴,你真的可以在功能方面與番石榴功能。

Furthermode,你讓你的列表中,如果你需要公開揭露它,這是很好的同時一成不變

您也可以讓你列表不變與靜態塊,但你需要初始化之前,以填補臨時列表最終名單。


檢查 Maps uniqueIndex documentation這是番石榴的一個非常酷的功能,通過它的任何屬性的允許索引的對象。 如果許多對象共享相同的屬性值,則可以使用Multimaps.index,對於每個鍵,它將爲您提供具有此屬性的objeets的列表。