Ich habe unterhalb von Enum, von dem ich entsprechende execute
Methode Basis aufrufen, welche Art von enum (eventType) übergeben wird.Wie Code in mehreren Aufzählungsnamen wiederverwenden?
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
}
}
Zum Beispiel: Wenn ich "EventA"
bekommen, dann execute
Methode Ich rufe es ist. Ähnlich, wenn ich "EventB"
bekomme, dann rufe ich es ist execute
Methode und so weiter.
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);
Im Allgemeinen werde ich mehr Ereignistypen hat (etwa 10-12) in der gleichen Enum-Klasse und meist werden sie gleichen Vorgang wie Eventa, EventB und EventC tun.
Frage:
Nun, wie Sie sehen können, Code in execute
Methode von EventA
und EventC
sind identisch ähnlich, aber der einzige Unterschied ist, was ich als "key" (event name)
in der zurück unveränderlichen Karte setzen. Gibt es eine Möglichkeit, diesen duplizierten Code zu entfernen, aber immer noch die gleiche Funktionalität in der Enumeration zu erreichen.
Zum Beispiel etwas auf diesem Boden. Indem Sie mehrere Enums nebeneinander schreiben, die durch ein Komma getrennt sind (wenn die Funktionalität der Ausführungsmethode gleich ist). Ich weiß, dass das nicht funktioniert, weil ich eine abstrakte Methode habe, die ich überall implementieren muss, aber ist es immer noch möglich, einige Änderungen oder andere bessere Methoden zu machen?
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
}
Ich kenne einen Weg, um ein Verfahren mit allen gängigen Dinge zu machen und jene Methode aufrufen, durch geeignete Event-Typ Enum Name übergeben. Gibt es einen anderen Weg, als Enum-Features oder andere Änderungen zu verwenden?
Wenn es irgendeinen anderen besseren Weg oder irgendein anderes Entwurfsmuster gibt, um dies zu tun, bin ich offen für Vorschläge, die mir helfen können, doppelten Code zu entfernen.
Idee ist - basierend auf welche Art von Ereignis übergeben wird, möchte ich seine Ausführungsmethode aufrufen und Doppelarbeit zu vermeiden, wenn möglich.
Machen Sie nicht "execute" abstrakt, und dann den Code, der sich in der Überschreibung ändert und rufen Sie es aus "Ausführen". – 4castle
Bedeutung? Nicht ganz folgen. Wenn ich es nicht abstrakt mache, kann ich für jede Enumeration keine individuelle Ausführungsmethode aufrufen. – john
Ich sage, den Teil zu extrahieren, der in seine eigene abstrakte Methode übergeht, und 'execute' zu konkretisieren. – 4castle