Try using it in your preferred language.

English

  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Deutsch
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar
translation

Dies ist ein von KI übersetzter Beitrag.

제이온

[Effektives Java] Punkt 5: Verwenden Sie Dependency Injection anstelle von expliziten Ressourcen

  • Schreibsprache: Koreanisch
  • Referenzland: Alle Länder country-flag

Sprache auswählen

  • Deutsch
  • English
  • 汉语
  • Español
  • Bahasa Indonesia
  • Português
  • Русский
  • 日本語
  • 한국어
  • Français
  • Italiano
  • Türkçe
  • Tiếng Việt
  • ไทย
  • Polski
  • Nederlands
  • हिन्दी
  • Magyar

Von durumis AI zusammengefasster Text

  • Wenn eine Klasse intern von einer oder mehreren Ressourcen abhängt, sollten statische Utility-Klassen und Singleton-Klassen vermieden werden. Es ist vorzuziehen, Dependency Injection zu verwenden.
  • Die Verwendung von Dependency Injection kann die Flexibilität, Wiederverwendbarkeit und Testbarkeit der Klasse verbessern. Ressourcen können über den Konstruktor, statische Factories, Builder usw. injiziert werden.
  • Dependency Injection kann verwendet werden, indem entweder die Ressource selbst oder eine Ressourcen-Factory übergeben wird. In Projekten mit vielen Abhängigkeiten ist die Verwendung eines Dependency Injection Frameworks effizienter.

Wenn eine Klasse intern von einer oder mehreren Ressourcen abhängt und diese Ressourcen das Klassenverhalten beeinflussen, sollten Sie keine Singleton- und statischen Utility-Klassen verwenden.


Diese Ressourcen sollten auch nicht von der Klasse selbst erstellt werden. Stattdessen sollten Sie die benötigten Ressourcen an den Konstruktor übergeben. Durch die Injektion abhängiger Objekte können Sie die Flexibilität, Wiederverwendbarkeit und Testbarkeit der Klasse verbessern.


Beispiel

Beispiel für die Verwendung einer statischen Utility-Klasse

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Logik unter Verwendung des Wörterbuchs
    }

    public static List suggestions(String typo) {
        // Logik unter Verwendung des Wörterbuchs
    }

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


Beispiel für die Verwendung einer Singleton-Klasse

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Logik unter Verwendung des Wörterbuchs
    }

    public static List suggestions(String typo) {
        // Logik unter Verwendung des Wörterbuchs
    }


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


Lösung 1 - Entfernen Sie das final-Schlüsselwort aus dem Feld.

public class SpellChecker {

    private Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static void changeDictionary(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // Logik unter Verwendung des Wörterbuchs
    }

    public static List suggestions(String typo) {
        // Logik unter Verwendung des Wörterbuchs
    }


Sie können das final-Schlüsselwort für das Wörterbuch in einer statischen Utility-Klasse oder einer Singleton-Klasse entfernen und das Wörterbuch von außen durch ein anderes Wörterbuch ersetzen. Diese Methode ist jedoch selbst schwer zu verwenden und kann in einer Multithread-Umgebung zu Parallelitätsproblemen führen.


Lösung 2 - Verwenden Sie die Injektion abhängiger Objekte.

public class SpellChecker {

    private final Lexicon dictionary;

    public SpellChecker(Lexicon dictionary) {
        this.dictionary = dictionary;
    }

    public static boolean isValid(String word) {
        // Logik unter Verwendung des Wörterbuchs
    }

    public static List suggestions(String typo) {
        // Logik unter Verwendung des Wörterbuchs
    }


Anhand des obigen Beispiels können Sie erkennen, dass statische Klassen und Singleton-Klassen nicht von internen Ressourcen abhängig sein sollten. Das bedeutet, dass interne Ressourcen am besten von außen injiziert werden.


Eine Klasse, die die Injektion abhängiger Objekte verwendet, bietet durch das final-Schlüsselwort die Garantie der Unveränderlichkeit und unterstützt mehrere Ressourceninstanzen. Die Injektion abhängiger Objekte kann nicht nur im Konstruktor, sondern auch in statischen Fabriken und Buildern angewendet werden.


Bei der Injektion abhängiger Objekte können Sie die Ressourcen selbst übergeben, aber es wird auch häufig verwendet, eine Ressourcenfabrik zu übergeben. Eine Fabrik ist ein Objekt, das bei jedem Aufruf eine Instanz eines bestimmten Typs erstellt. Diese Methode wird als Factory-Method-Pattern bezeichnet, und Supplier in Java 8 ist ein perfektes Beispiel für die Darstellung einer Fabrik.


public static List create(Supplier generator) {
    ...


Normalerweise wird ein eingeschränkter Platzhaltertyp verwendet, um den Typparameter der Fabrik einzuschränken. Mit dieser Methode kann der Client der Fabrik jeden Untertyp des von ihm angegebenen Typs übergeben.


Die Injektion abhängiger Objekte verbessert die Flexibilität und Testbarkeit, aber bei Projekten mit vielen Abhängigkeiten kann dies sehr kostspielig sein. In solchen Fällen können Sie ein Framework für abhängige Objekte (Dagger, Guice, Spring usw.) verwenden, um die Kosten zu senken.


Quelle

제이온
제이온
제이온
제이온
[Effektives Java] Artikel 4. Verwenden Sie einen privaten Konstruktor, um die Instanziierung zu verhindern Bei Utility-Klassen, die nur statische Methoden und Felder enthalten, sollten Sie den Zugriffsschutzmodifizierer des Konstruktors auf private setzen, um die Instanziierung zu verhindern. Dadurch wird verhindert, dass Benutzer den Konstruktor für automatis

28. April 2024

[Effektives Java] Item 1. Statische Fabrikmethoden in Betracht ziehen Statische Fabrikmethoden sind eine flexible und effiziente Möglichkeit, Instanzen zu erstellen, anstatt Konstruktoren zu verwenden. Sie können benannt werden, Instanzen zurückgeben, die bestimmten Bedingungen entsprechen, und die Leistung durch Caching ve

27. April 2024

[Effektives Java] Artikel 3. Garantieren Sie Singleton mit einem privaten Konstruktor oder einem Aufzähltyp Dieser Artikel stellt drei Methoden zur Implementierung des Singleton-Musters in Java vor (öffentliches statisches Mitglied, statische Fabrikmethode, Aufzähltyp) und erläutert die Vor- und Nachteile jeder Methode sowie Vorsichtsmaßnahmen bei der Serialisi

27. April 2024

Wie Rust Konsistenzfehler verhindert Rust ist eine leistungsstarke Sprache, die die Herausforderungen der konkurrenten Programmierung bewältigt. Dank des Typsystems und des Besitzmodells ist der Datenaustausch und die gemeinsame Nutzung zwischen Threads sicher. Durch Muster der internen Vari
곽경직
곽경직
곽경직
곽경직
곽경직

28. März 2024

Konzeptionelles Datenmodellieren Konzeptionelles Datenmodellieren ist der Prozess, Entitäten zu trennen und die Beziehungen zwischen Entitäten in einem ERD darzustellen. Entitäten sind unabhängige Informationseinheiten, und Attribute sind die Daten, die eine Entität besitzt. Ein Bezeichn
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8. April 2024

[Javascript] Objektstruktur (V8) Das JavaScript-Objekt wird in der V8-Engine je nach Zustand als strukturierte, optimierte Fast-Mode oder als Hashmap-basierter Dictionary-Mode dargestellt. Der Fast-Mode ist schnell, wenn Schlüssel und Werte fast fixiert sind, aber bei der Hinzufügung neu
곽경직
곽경직
곽경직
곽경직
곽경직

18. März 2024

Welche Tests sollten bei der Entwicklung einer 1-Personen-App durchgeführt werden? Erfahren Sie, wie Sie die Prioritäten für Tests bei der App-Entwicklung setzen und eine effiziente Teststrategie entwickeln. Der Autor priorisiert Menschentests, Integrationstests, Unit-Tests und Akzeptanz-/Widget-Tests und betont die Zeiteffizienz. Entde
Alien Story
Alien Story
Alien Story
Alien Story
Alien Story

16. Mai 2024

Prisma Client Mocking für Unit-Tests in NestJS Beim Unit-Test von Anwendungen ist die Entfernung externer Abhängigkeiten von großer Bedeutung. Mit der Jest-Mocking-Methode von Prisma ORM können Sie Unit-Tests einfach durchführen. Nach der Installation des Pakets jest-mock-extended können Sie Prisma Cl
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2. April 2024

Mr. Know-All 2 – August 2023 Dieser Beitrag befasst sich mit der Verarbeitung von PDF-Dateien für das maschinelle Lernen von LLMs mit internen Unternehmensdaten. Er erläutert die Verwendung der OpenAI API, LangChain und Streamlit, um Vektor-Stores wie FAISS und ChromaDB zu verbinden.
Pilot AISmrteasy
Pilot AISmrteasy
Pilot AISmrteasy
Pilot AISmrteasy

21. März 2024