如何将对象转换为枚举以在开关语句中使用它

时间:2017-01-27 12:59:47

标签: java enums

使用Java 8,我有一个Map,我需要转换为另一个Map替换键名,有时替换值。例如,当它们变成枚举时,我需要将这些枚举转换为其他常量(字符串,有时是整数)。我不想比较字符串,即theEnum.name(),因为可能有重复,但更愿意将对象转换为枚举并打开它。但是,我找不到将Object转换为可切换枚举的方法。 Enum.valueOf不会返回可以切换的内容(请参阅下面的示例)。

private void put(String key, Object value) {
  if (value != null && value.getClass().isEnum()) {
  Enum<?> val = (Enum<?>)value; 
  /* The below line has the following problem:
   * Cannot switch on a value of type Enum. 
   * Only convertible int values, strings or enum variables are 
   * permitted */
  switch (Enum.valueOf(val.getClass(), val.name())) {
    case EmploymentType.FULL_TIME_EMPLOYEE : value = "Fast anställd";
         break;
    case ResidenceType.TENANCY : value = "Hyresrätt";
         break;
    default : break;
  }
}
map.put(key, value);    

}

我知道我能做到:

private void put(String key, Object value) {
  if (value != null && value.getClass().isEnum()) {
    if (value.equals(EmploymentType.FULL_TIME_EMPLOYEE) value = "Fast anställd";
    else if (value.equals(ResidenceType.TENANCY) value = "Hyresrätt";
  }
  map.put(key, value);    
}

但是发现它不那么优雅,并且像switch语句一样容易阅读。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:5)

看起来你必须处理多种枚举类型。但是,您无法在一个switch语句中切换多个枚举类型。我想你可以改用Map<Enum<?>, Object>

您可以像这样设置HashMap

Map<Enum<?>, Object> enumMap = new HashMap<>();
enumMap.put(EmploymentType.FULL_TIME_EMPLOYEE, "Fast anställd");
enumMap.put(ResidenceType.TENANCY, "Hyresrätt");

并像这样使用它:

if (enumMap.containsKey(value)) {
    value = enumMap.get(value);
}
map.put(key, value);

答案 1 :(得分:2)

一种可能性是让枚举实现具有getValue()或类似方法的接口。即使可以在不同的枚举之间切换,该代码也不是很优雅。

然后你可以写

if (value != null && value instanceof MyInterface) {
    MyInterface foo = (MyInterface) value;
    value = foo.getValue();   // Although it's a bit ugly to reassign a parameter
}
map.put(key, value);

答案 2 :(得分:0)

Calculatos和Kaymans的答案都是很好的解决方案。在尝试它们之后,我选择使用计算器,因为它更少侵入并使用建议的方法在构造函数中仅使用枚举构建另一个Map,然后使用该枚举映射完全按照建议转换put方法中的枚举,即

if (enumMap.containsKey(value)) {
  value = enumMap.get(value);
}
map.put(key, value);