Wählen Sie eine konkrete Implementierung zur Laufzeit mit Java 8

8

Ich weiß nicht, wo ich if / switch setzen soll, wenn ich die zu instanziierende Implementierung / Unterklasse auswähle, besonders wenn man bedenkt, dass Interfaces jetzt statische Methoden haben können.

Nehmen wir an, ich habe einen Service, einen Typ, der durch eine Schnittstelle und einige Implementierungen definiert wird. Ich schätze, es wäre besser, diese Logik nicht in den Dienst zu stellen, sondern die Fabrikmethode zu verwenden. Aber sollte es in der Schnittstelle oder in einer anderen Klasse mit einer Param-to-Type-Karte gehen, wie in dieser Antwort vorgeschlagen?

>

Es scheint mir natürlich, es in die Schnittstelle zu setzen:

%Vor%

und dann rufen Sie einfach aus dem Service:

%Vor%

Aber ich weiß nicht, ob es schlecht ist, dass die Schnittstelle über ihre Implementierung Bescheid weiß, oder dass eine Elternklasse über ihre Subtypen Bescheid weiß. Also

  1. Wo soll ich diese Logik hinstellen?
  2. Würde sich das sehr ändern, wenn ich Unterklassen eines Typs wähle?
user3748908 20.03.2015, 15:42
quelle

2 Antworten

6

Benutze Factory dafür. Auf diese Weise können Sie single responsibility principle beibehalten. In einem meiner eigenen Projekte definiert interface jedoch eine Methode, die bestimmt, für welche Art von Argument diese spezielle Implementierung verwendet werden soll. Dank dessen und mit Reflections wird der gesamte Prozess automatisiert. Reflections findet alle Klassen, die die angegebene interface implementiert haben, und speichert ihren 'Verwendungstyp' in einer Map für eine schnelle Suche. Dank einer solchen Lösung muss der Entwickler nur dann eine neue Implementierung erstellen, wenn er sie benötigt. In anderen Teilen des Systems sind keine weiteren Änderungen erforderlich, auch nicht in der Fabrikklasse.

Reflections hat eine nette Funktion, um Metadaten zur Kompilierzeit zu speichern, so dass die Laufzeitsuche für die richtigen Klassen nur ein Wimpernschlag ist

    
Antoniossss 20.03.2015, 15:48
quelle
2

Es gibt eine ganze Reihe von Lösungen für Ihr Problem, ich denke, Sie kennen viele von ihnen bereits.

Das statische Fabrikmethodenmuster

%Vor%

Das funktioniert, aber es macht die Trennung von Schnittstelle und Implementierung schwierig. Die Schnittstelle muss alle möglichen Implementierungen kennen und ist nicht besonders erweiterbar. Um eine neue Implementierung hinzuzufügen, müssen Sie die Schnittstelle ändern.

Fabrikmuster

Dies ist mehr oder weniger alt-Schule von dem Buch GOF:

%Vor%

Damit können Sie die Fabrik (und sogar Stapelfabriken) ersetzen. Es hat - allerdings - den Nachteil, dass Sie das Fabrikobjekt umgehen müssen. Beachten Sie, dass Sie mit Java 8 auch sehr leichte Lambda-basierte Factorys verwenden können (siehe Ссылка )

Container

Eine andere Lösung, obwohl sie ziemlich schwer sein kann, besteht darin, die Konstruktion des Objekts einem Behälterrahmen zu überlassen. In diesen Fällen stellt der Container Ihre Objektfactory bereit. Der tatsächliche Objekttyp wird der Konfiguration überlassen. Spring und Java EE machen das ziemlich gut. Kombinieren Sie auch Abhängigkeitsinjektion für zusätzlichen Effekt.

Das sind zumindest die, die ich mir vorstellen kann.

    
dhke 20.03.2015 15:58
quelle