2016-05-11 76 views
0

使用反向值我有這樣的值(例如只顯示了幾個值,但你將捉對)枚舉:_800,_830,_900,_24HOURS,封閉在枚舉在Java中

這些都一個相應的值,所以我加入到我的枚舉中,你可以在Java中完成,一個值域和一個getter和setter值,像這樣(爲了空間起見,我沒有顯示getter和setter,但它們是標準的):

enum Hours { 
    _800("08:00"), 
    _830("08:30"), 
    CLOSED("Closed"), 
    APPT("By Appt.") 
    // etc 
    ; 

    Hours(String v) { 
     val = v; 
    } 
    String val; 
} 

我也希望能夠去另一個方向,那就是,如果我有一個值(例如「08」),我希望它返回枚舉_800。所以在枚舉我添加了一個地圖:

static Map<String,String> valToEnumMap = new HashMap(); 

然後我將此添加到我的構造函數:

Hours(String v) { 
     val = v; 
     valToEnumMap.put(v, this); 
    } 

和新方法:

Hours valToEnum(String v) { 
    return valToEnumMap(v); 
} 

但是當我嘗試運行它,我在嘗試插入地圖的位置出現初始化錯誤。我曾嘗試其他東西,如

valToEnumMap.put(v, valueOf(name()); 

但同樣的錯誤。我確實找到了解決方法,但速度很慢,所以我想知道我做錯了什麼?下面是我用它的解決方法是緩慢:

public static OfficeHoursTimes valToEnum(String val) { 
     for (OfficeHoursTimes o : OfficeHoursTimes.values()) { 
      if (o.getVal().equals(val)) { 
        return o; 
      } 
     } 
     return null; 
} 

但是,必須有一個更好的辦法

+0

枚舉應該是不變的,所以請沒有制定者 –

回答

1

的問題是,你要使用地圖它的初始化之前,因爲你的枚舉情況下獲得首先創建。

要聲明你的地圖是這樣的:

static final Map<String,Hours> valToEnumMap = _createValueMap(); 

然後

private static Map<String,Hours> _createValueMap() 
{ 
    Map<String, Hours> map = new HashMap<>(); 

    //...iterate through values() and put them all in the map ... 

    return map; 
} 
+0

>>問題是,你要使用它的初始化之前的地圖,因爲你的枚舉情況下會首先創建。 - 這是不正確的,添加日誌,你會看到它 – AdamSkywalker

+0

@AdamSkywalker根據我的日誌,馬特是正確的。首先,創建所有枚舉實例。接下來是靜態字段和靜態初始化程序。 – vojta

+0

@vojta https://gist.github.com/AdamSkywalker/11b2c6fcc12a2076c83bbe90883c14bc – AdamSkywalker

0

乍一看,似乎你的地圖定義是錯誤的。
嘗試

static Map<String,Hours> valToEnumMap = new HashMap<String,Hours>(); 
+0

對不起。它是HashMap <>()而不是HashMap()。一個錯字。它可以從聲明中的映射推斷參數。 – Tony