我有下面的枚舉我打電話適當execute
方法基礎什麼類型的枚舉(eventType)傳遞。如何在多個枚舉名稱中重用代碼?
public enum EventType {
EventA {
@Override
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 {
@Override
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();
}
},
EventC {
@Override
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(EventC.name(), holder)
.build();
}
};
public abstract Map<String, Map<String, String>> execute(String eventMapHolder);
public Map<String, String> parseStringToMap(String eventMapHolder) {
// parse eventMapHolder String to Map
}
public Map<String, String> getClientInfo(final String clientId) {
// code to populate the map and return it
}
}
例如:如果我"EventA"
,然後我打電話是execute
方法。同樣,如果我得到"EventB"
那麼我就是它的調用方法execute
方法等等。
String eventType = String.valueOf(payload.get("eventType"));
String eventMapHolder = String.valueOf(payload.get("eventMapHolder"));
Map<String, Map<String, String>> processedMap = EventType.valueOf(eventType).execute(eventMapHolder);
一般來說,我會在同一個枚舉類有更多的事件類型(10-12),大多他們會做相同的動作EventA,EventB和EventC。
問:
現在你可以看到,在EventA
和EventC
execute
方法的代碼相同且相似,但唯一不同的是我把爲"key" (event name)
在返回不可變的映射。有什麼辦法刪除重複的代碼,但仍然在枚舉中實現相同的功能。
例如,在這個基礎上的東西。通過以逗號分隔編寫多個枚舉(如果執行方法功能相同)。我知道這是行不通的,因爲我有一個抽象方法,我需要在任何地方實現它,但是通過進行一些更改或其他更好的方法仍然可能?
public enum EventType {
EventA,
EventC {
@Override
public Map<String, Map<String, String>> execute(String eventMapHolder) {
// same code which is there in execute method for EventA and EventC
}
},
EventB {
@Override
public Map<String, Map<String, String>> execute(String eventMapHolder) {
// same code which is there in execute method of EventB
}
};
// other methods which are there already
}
我知道一種方法是製作一個方法,包含所有常見事物,並通過傳遞適當的Event類型枚舉名來調用這些方法。除此之外,還有其他方法使用枚舉特性或其他更改嗎?
如果有任何其他更好的方法或任何其他設計模式來做到這一點,那麼我打開建議welll可以幫助我刪除重複的代碼。
想法是 - 什麼類型的事件通過的基礎上,我想調用它的執行方法,並儘可能避免重複。
不要讓'execute'抽象,然後把改變的代碼放在override中,並從'execute'中調用它。 – 4castle
含義?沒有完全遵循。如果我不把它抽象化,那麼我將無法爲每個枚舉調用單獨的執行方法。 – john
我想說的是將更改的部分抽取到自己的抽象方法中,並使'execute'具體。 – 4castle