Ich habe es mit einer Reihe von Nachrichtenobjekten zu tun, von denen jedes eine eindeutige Kennung hat, die ihnen entspricht. Jede Nachricht kann entweder aus einer Map oder aus einem ByteBuffer erstellt werden (die Nachrichten sind binär, aber wir wissen, wie man zu und von einer binären Repräsentation überträgt).Java - statische Factory-Methode und Switch-Anweisungen
Die aktuelle Implementierung für diese Meldungen Konstruktion ist in etwa wie folgt: Jetzt
public static Message fromMap(int uuid, Map<String, Object> fields) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(fields);
.
.
.
default:
// Error
return null;
}
}
public static Message fromByteBuffer(int uuid, ByteBuffer buffer) {
switch (uuid) {
case FIRST_MESSAGE_ID:
return new FirstMessage(buffer);
.
.
.
default:
// Error
return null;
}
}
, Josh Bloch's Effective Java spricht über Punkt 1: statt Konstrukteuren statische Factory-Methoden Betrachten, und dies scheint ein Ort zu sein, wo dieses Muster nützlich (Clients greifen nicht direkt auf die Konstruktoren der Nachrichtenuntertypen zu; stattdessen durchlaufen sie diese Methode). Aber ich mag es nicht, dass wir daran denken müssen, zwei Switch-Statements zu aktualisieren (verletzt das DRY Prinzip).
Ich würde jede Einsicht in die beste Möglichkeit, dies zu erreichen, schätzen; Objekte werden nicht zwischengespeichert (jeder Aufruf von fromMap oder fromByteBuffer gibt ein neues Objekt zurück), wodurch einige Vorteile einer solchen statischen Factory-Methode zunichte gemacht werden. Etwas an diesem Code erscheint mir falsch, daher würde ich gerne die Gedanken der Community darüber hören, ob dies ein gültiger Weg ist, um neue Objekte zu konstruieren, oder wenn nicht, was eine bessere Lösung wäre.
Wenn die Factory-Objekte in einer Map gespeichert und mit UUID abgerufen werden, ist kein Switch erforderlich. – rsp
yup, das habe ich gesagt :-) Ich habe sogar einen Link zu deiner Antwort hinzugefügt :) – Fortega
Es ist eine gute Lösung (also +1 dafür), aber wenn das Ziel darin bestand, den Doppel-Switch loszuwerden, hättest du nur faktorisieren können aus der Switch-Logik zu einer separaten Methode. (Die Karte ist im Grunde ein getarnter Schalter) – wds