2016-05-11 52 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