如何根据传递的类型调用枚举方法?

joh*_*ohn 2 java oop enums design-patterns

我有以下所示的Enum,我需要根据它的适当方法来调用它的事件类型.

public enum EventType {

  EventA {
    // cannot call this method
    public Map<String, Map<String, String>> execute(String eventMapHolder) {
      final Map<String, String> holder = parseStringToMap(eventMapHolder);
      if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) {
        return ImmutableMap.of();
      }
      String itemId = holder.get("m_itemId");
      Map<String, String> clientInfoHolder = getClientInfo(itemId);
      holder.putAll(clientInfoHolder);
      return ImmutableMap.<String, Map<String, String>>builder().put(EventA.name(), holder)
          .build();
    }
  },
  EventB {
    // cannot call this method
    public Map<String, Map<String, String>> execute(String eventMapHolder) {
      final Map<String, String> holder = parseStringToMap(eventMapHolder);
      if (holder.isEmpty() || Strings.isNullOrEmpty(holder.get("m_itemId"))) {
        return ImmutableMap.of();
      }
      return ImmutableMap.<String, Map<String, String>>builder().put(EventB.name(), holder)
          .build();
    }
  };

  public Map<String, String> parseStringToMap(String eventMapHolder) {
    // parse eventMapHolder String to Map
  }

  public Map<String, String> getClientInfo(final String clientId) {
    Map<String, String> clientInfoMap = Maps.newHashMap();
    // code to populate this map
    return clientInfoMap;
  }

  public Map<String, String> getDeviceInfo(final String itemId) {
    Map<String, String> deviceInfoMap = Maps.newHashMap();
    // code to populate this map
    return deviceInfoMap;
  }
}
Run Code Online (Sandbox Code Playgroud)

题:

例如:如果我得到"EventA",那么我想调用它的execute方法.同样,如果我得到"EventB"那么我想调用它的execute方法等等.现在由于明显的原因它无法工作,因为它无法execute在同一个枚举中找到方法.

String eventType = String.valueOf(payload.get("eventType"));
String eventMapHolder = String.valueOf(payload.get("eventMapHolder"));
// this below line gives compilation error as it is not able to find execute method.
Map<String, Map<String, String>> processedMap = EventType.valueOf(eventType).execute(eventMapHolder);
Run Code Online (Sandbox Code Playgroud)

我需要根据传递的事件类型执行某些操作.

  • 如果"EventA"传递,那么首先我将eventMapHolder字符串转换为Map(让我们称之为持有者),然后我itemId从该持有者映射中提取,然后我传递itemIdgetClientInfo方法,而方法又返回一个Map(让我们称之为clientInfoHolder).然后我将clientInfoHolder地图中的所有内容放入holder地图中,然后最终根据holder其键返回另一个地图.
  • 如果"EventB"传递,那么首先我将eventMapHolder字符串转换为Map(让我们调用此持有者),然后在holder地图上创建一个新的不可变映射基础及其键并返回该映射.

一般来说,我会在同一个枚举类中有更多的事件类型,并且大多数它们将执行与EventA和EventB相同的操作.

使这项工作的正确和重要方法是什么?如何调用特定枚举类型的方法?

如果有任何其他更好的方式或任何其他设计模式来做到这一点,那么我愿意接受建议.

Msh*_*nik 5

您可以在a上定义抽象方法enum,只要在每个枚举实例中覆盖该方法即可.这是一个简单的例子:

public enum EnumWithMethod {

  VALUE_A {
    @Override
    public String enumMethod(String s) {
      return s + "-A";
    }
  },
  VALUE_B{
    @Override
    public String enumMethod(String s) {
      return s + "-B";
    }
  };

  public abstract String enumMethod(String s);

}
Run Code Online (Sandbox Code Playgroud)

因此,给定一个任意的Enum实例,你可以调用enumMethod:

EnumWithMethod e = EnumWithMethod.VALUE_A;
String str = e.enumMethod("asdf"); //asdf-A
Run Code Online (Sandbox Code Playgroud)

对于您的示例,这就像添加一样简单

public abstract Map<String, Map<String, String>> execute(String eventMapHolder);
Run Code Online (Sandbox Code Playgroud)

对你的EventType枚举.