Как вызвать метод enum basis, по какому типу он передается?



У меня есть ниже перечисление, как показано ниже, из которого мне нужно вызвать его соответствующий метод, основанный на том, какой тип события это.



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;
}
}


Вопрос:



Например: если я получаю "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);


Мне нужно выполнить определенные действия в зависимости от того, какие типы событий передаются.




  • Если передается "EventA", то сначала я преобразую строку eventMapHolder в Map (назовем этот держатель), а затем извлекаю itemId из этой карты держателя, а затем передаю itemId в метод getClientInfo, который в свою очередь возвращает карту (назовем этот clientInfoHolder). А затем я помещаю все из clientInfoHolder карты в holder карту и затем, наконец, возвращаю другую карту, основанную на holder вместе с ее ключом.

  • Если "EventB" передается, то сначала я преобразую eventMapHolder строка в карту (назовем это держателем), а затем я создаю новый неизменяемый базис карты на карте holder вместе с ее ключом и возвращаю эту карту.


В общем случае у меня будет больше типов событий в том же классе enum, и в основном они будут выполнять ту же операцию, что и EventA и EventB.



Каков правильный и ООП способ заставить это работать? Как я могу вызвать метод этого конкретного типа перечисления?



Если есть какой-либо другой лучший способ или любой другой шаблон дизайна, чтобы сделать это, то я открыт и для предложений.

633   1  

1 ответ:

Можно определить абстрактные методы на 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);

}

Таким образом, учитывая произвольный экземпляр перечисления, вы можете вызвать enumMethod:

EnumWithMethod e = EnumWithMethod.VALUE_A;
String str = e.enumMethod("asdf"); //asdf-A

Для вашего примера это так же просто, как добавить

public abstract Map<String, Map<String, String>> execute(String eventMapHolder);

К вашему EventType перечислению.

Comments

    Ничего не найдено.