Как вызвать метод 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.
Каков правильный и ООП способ заставить это работать? Как я могу вызвать метод этого конкретного типа перечисления?
Если есть какой-либо другой лучший способ или любой другой шаблон дизайна, чтобы сделать это, то я открыт и для предложений.
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