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

Per*_*Per 3 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);    
Run Code Online (Sandbox Code Playgroud)

}

我知道我能做到:

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);    
}
Run Code Online (Sandbox Code Playgroud)

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

Cal*_*tor 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");
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

if (enumMap.containsKey(value)) {
    value = enumMap.get(value);
}
map.put(key, value);
Run Code Online (Sandbox Code Playgroud)