제이온

[Effective Java] Item 5: Verwende Dependency Injection statt explizite Ressourcenzuweisung

  • Verfasst in: Koreanisch
  • Land: Alle Ländercountry-flag
  • IT

Erstellt: 2024-04-28

Erstellt: 2024-04-28 13:39

Wenn eine Klasse intern von einer oder mehreren Ressourcen abhängt und diese Ressourcen das Verhalten der Klasse beeinflussen, sollten Singleton- und statische Utility-Klassen nicht verwendet werden.


Diese Ressourcen sollten nicht direkt von der Klasse erstellt werden. Stattdessen ist es wünschenswert, die benötigten Ressourcen an den Konstruktor zu übergeben. Durch die Dependency Injection (Abhängigkeitsinjektion) können die Flexibilität, Wiederverwendbarkeit und Testbarkeit der Klasse verbessert werden.


Beispiel

Beispiel für eine statische Utility-Klasse

Diese Utility-Klasse geht davon aus, dass nur ein Wörterbuch verwendet wird. In der Praxis gibt es jedoch oft separate Wörterbücher für verschiedene Sprachen und sogar spezielle Wörterbücher für Fachbegriffe.


Beispiel für eine Singleton-Klasse


Auch Singleton-Klassen gehen davon aus, dass nur ein Wörterbuch verwendet wird, daher tritt der gleiche Nachteil wie oben auf.


Lösung 1 – Das Schlüsselwort final im Feld entfernen


Bei statischen Utility-Klassen oder Singleton-Klassen kann das Schlüsselwort final für das dictionary entfernt und die Möglichkeit geschaffen werden, das dictionary von außen durch ein anderes Wörterbuch zu ersetzen. Diese Methode ist jedoch umständlich in der Anwendung und kann in Multithread-Umgebungen zu Problemen mit der Gleichzeitigkeit führen.


Lösung 2 – Dependency Injection (Abhängigkeitsinjektion) verwenden


Anhand des obigen Beispiels konnten wir feststellen, dass statische Klassen und Singleton-Klassen nicht von internen Ressourcen abhängen sollten. Das bedeutet, dass es wünschenswert ist, interne Ressourcen von außen zu injizieren.


Klassen, die Dependency Injection verwenden, gewährleisten durch das Schlüsselwort final die Unveränderlichkeit und bieten den Vorteil, dass mehrere Ressourceninstanzen unterstützt werden. Darüber hinaus kann die Dependency Injection nicht nur im Konstruktor, sondern auch in statischen Fabriken und Buildern angewendet werden.


Bei der Dependency Injection kann die Ressource selbst übergeben werden, aber es wird oft auch eine Ressourcenfabrik übergeben. Eine Fabrik ist ein Objekt, das bei jedem Aufruf eine Instanz eines bestimmten Typs erstellt. Diese Technik wird als Factory-Method-Pattern bezeichnet, und Supplier<T> in Java 8 ist ein perfektes Beispiel für die Darstellung einer Fabrik.



In der Regel wird ein beschränkter Wildcard-Typ verwendet, um den Typparameter der Fabrik einzuschränken. Auf diese Weise kann der Client der Fabrik jeden beliebigen Untertyp des angegebenen Typs übergeben.


Dependency Injection verbessert die Flexibilität und Testbarkeit, kann aber bei Projekten mit sehr vielen Abhängigkeiten zu erheblichen Kosten führen. In solchen Fällen können Dependency-Injection-Frameworks (Dagger, Guice, Spring usw.) verwendet werden, um die Kosten zu senken.


Quelle

Kommentare0