【发布时间】:2016-12-12 02:20:29
【问题描述】:
我有下面的枚举,如下所示,我需要根据它是什么类型的事件来调用它的适当方法。
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方法它又返回一个 Map(我们称之为 clientInfoHolder)。然后我将clientInfoHolder映射中的所有内容放入holder映射中,最后返回另一个基于holder的映射及其密钥。 - 如果
"EventB"被传递,那么首先我将eventMapHolder字符串转换为Map(我们称之为持有者),然后我在holder映射及其键上创建一个新的不可变映射基础并返回该映射。
一般来说,我会在同一个枚举类中拥有更多的事件类型,并且大多数情况下它们会执行与 EventA 和 EventB 相同的操作。
使这项工作正常进行的正确方法是什么?如何调用该特定枚举类型的方法?
如果有任何其他更好的方法或任何其他设计模式可以做到这一点,那么我也愿意提供建议。
【问题讨论】:
标签: java oop design-patterns enums