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从该持有者映射中提取,然后我传递itemId给getClientInfo方法,而方法又返回一个Map(让我们称之为clientInfoHolder).然后我将clientInfoHolder地图中的所有内容放入holder地图中,然后最终根据holder其键返回另一个地图."EventB"传递,那么首先我将eventMapHolder字符串转换为Map(让我们调用此持有者),然后在holder地图上创建一个新的不可变映射基础及其键并返回该映射.一般来说,我会在同一个枚举类中有更多的事件类型,并且大多数它们将执行与EventA和EventB相同的操作.
使这项工作的正确和重要方法是什么?如何调用特定枚举类型的方法?
如果有任何其他更好的方式或任何其他设计模式来做到这一点,那么我愿意接受建议.
您可以在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枚举.