Java-枚举转换器的通用抽象类

问题描述 投票:1回答:1

[我有一些枚举分别是name(“ String”)和value(“ Integer”)对,我必须为Json Deserialize实现一个@JsonCreator方法,其输入可以是名称,也可以是value。

//User Enum
public enum UserType {
   StakeHolder(1),...

   private static final Map<String, UserType> helper = ImmutableMap.<String, UserType>builder()
            .put(String.valueOf(StakeHolder.getValue()), StakeHolder)
            .put(StakeHolder.name(), StakeHolder)
            .build();

   @JsonCreator
   public static UserType jsonDeserialize(String json) {
        return helper.get(json);
   }
}

//Role Enum
public enum RoleType {
   Admin(1),...

   private static final Map<String, RoleType> helper = ImmutableMap.<String, RoleType>builder()
            .put(String.valueOf(Admin.getValue()), Admin)
            .put(Admin.name(), Admin)
            .build();

   @JsonCreator
   public static RoleType jsonDeserialize(String json) {
        return helper.get(json);
   }
}

但是我想知道是否有任何方法可以创建一个可以实现整体枚举的抽象类,这是为了避免在我的每个枚举中始终实现类似的“重复”代码。当前代码将是

public abstract class JsonDeserializeEnum<E extends Enum<E>> {
  // protected Enum<E> myEnums;
  // private static final Map<String, E> myEnumHelper; ???

  public JsonDeserializeEnum() {
    super();
    // how to loop through myEnums to do something like
    // for(E iterator : myEnums.value()) not work...myEnums is not a collection of enums?
    // myEnumHelper.put(String.valueOf(iterator.getValue()), (E) iterator);
    // myEnumHelper.put(iterator.name, (E) iterator);
  } 

  @JsonCreator
   public static E jsonDeserialize(String json) {
        return myEnumHelper.get(json);
   }
}

//then
public enum UserType implements JsonDeserializeEnum<UserType>{
    StakeHolder(1),...
}
public enum RoleType implements JsonDeserializeEnum<RoleType>{
    Admin(1),...
}

我在这里面临两个挑战,

1)我想在我的抽象类中拥有一个init / constructor,它可以将所有可用的Enums加载到静态Map中(仅加载一次),例如

调用UserType时,将所有用户类型的enum加载到静态映射中,然后从该映射中反序列化;调用RoleType时,将所有角色类型枚举加载到映射中,然后从同一映射中反序列化]

2)如果No.1不可能,那可以,假设我要摆脱抽象类中的映射,但仍然使用每个Enum中定义的映射,那么我的抽象类是否仍然知道并可以使用我的枚举中定义的地图?

我有一些枚举,它们分别是name(“ String”)和value(“ Integer”)对,我必须为Json Deserialize实现一个@JsonCreator方法,其输入可以是名称或值。

java enums abstract-class generic-programming
1个回答
0
投票

关键是使用JsonDeserializer。首先,您需要使用一个接口才能对所有枚举使用相同的代码:

public interface ValueEnum {
    String name();
    int value();
}
© www.soinside.com 2019 - 2024. All rights reserved.