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

Dit is een door AI vertaalde post.

제이온

[Effectieve Java] Item 5. Gebruik afhankelijke objectinjectie in plaats van resources expliciet te noemen

Selecteer taal

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

Samengevat door durumis AI

  • Wanneer een klasse intern afhankelijk is van een of meer resources, is het gebruik van statische utility-klassen en singleton-klassen af te raden. Het is raadzaam om afhankelijke objectinjectie te gebruiken.
  • Door afhankelijke objectinjectie te gebruiken, kunt u de flexibiliteit, herbruikbaarheid en testbaarheid van de klasse verbeteren. Resources kunnen worden geïnjecteerd via de constructor, statische fabriek, builder, enz.
  • Afhankelijke objectinjectie kan worden gebruikt door de resource zelf of de resource-fabriek door te geven. Voor projecten met veel afhankelijkheden is het efficiënter om een afhankelijke objectframework te gebruiken.

Als een klasse intern afhankelijk is van een of meer bronnen en die bronnen van invloed zijn op het gedrag van de klasse, is het beter om singletons en statische hulpprogrammaklassen te vermijden.


Deze bronnen mogen niet direct door de klasse worden gemaakt, maar in plaats daarvan moet de vereiste bron worden doorgegeven aan de constructor. Door middel van dependency injection kan de flexibiliteit, herbruikbaarheid en testbaarheid van de klasse worden verbeterd.


Voorbeeld

Voorbeeld van het gebruik van een statische hulpprogrammaklasse

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Logica met behulp van dictionary
    }

    public static List suggestions(String typo) {
        // Logica met behulp van dictionary
    }

Deze hulpprogrammaklasse gaat ervan uit dat er slechts één woordenboek wordt gebruikt. In de praktijk is er echter vaak een woordenboek per taal en worden er zelfs aparte woordenboeken gebruikt voor specialistische woordenschat.


Voorbeeld van het gebruik van een singletonklasse

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // Logica met behulp van dictionary
    }

    public static List suggestions(String typo) {
        // Logica met behulp van dictionary
    }


Ook een singletonklasse gaat ervan uit dat er slechts één woordenboek wordt gebruikt, waardoor hetzelfde nadeel optreedt.


Oplossing 1 - Verwijder het final-sleutelwoord uit het veld.

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) {
        // Logica met behulp van dictionary
    }

    public static List suggestions(String typo) {
        // Logica met behulp van dictionary
    }


Het is ook mogelijk om het final-sleutelwoord te verwijderen uit het dictionary van een statische hulpprogrammaklasse of singletonklasse en het dictionary van buitenaf te vervangen door een ander woordenboek. Deze methode is echter ongebruikelijk en kan in een multithread-omgeving leiden tot gelijktijdigheids problemen.


Oplossing 2 - Gebruik dependency injection.

public class SpellChecker {

    private final Lexicon dictionary;

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

    public static boolean isValid(String word) {
        // Logica met behulp van dictionary
    }

    public static List suggestions(String typo) {
        // Logica met behulp van dictionary
    }


Aan de hand van het bovenstaande voorbeeld kunnen we zien dat statische klassen en singletonklassen niet afhankelijk mogen zijn van interne bronnen. Dit betekent dat interne bronnen het beste van buitenaf kunnen worden geïnjecteerd.


Een klasse die gebruik maakt van dependency injection heeft het voordeel dat deze onmutable kan zijn dankzij het final-sleutelwoord en dat er meerdere broninstantiaties worden ondersteund. Bovendien kan dependency injection worden toegepast in de constructor, maar ook in statische fabrieken en builders.


Dependency injection kan worden toegepast door simpelweg de bron zelf door te geven, maar het is ook gebruikelijk om een bronfabriek door te geven. Een fabriek is een object dat elke keer dat het wordt aangeroepen, een instantie van een bepaald type genereert. Deze methode wordt ook wel de fabrieksmethode-patronen genoemd, en Supplier in Java 8 is een perfect voorbeeld van hoe een fabriek kan worden weergegeven.


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


Over het algemeen wordt een begrensde jokertype gebruikt om de typeparameter van de fabriek te beperken. Met deze methode kan de client een fabriek doorgeven die van elk ondertype van het door de client opgegeven type is.


Dependency injection verhoogt de flexibiliteit en testbaarheid, maar kan vrij duur zijn voor projecten met veel afhankelijkheden. In dergelijke gevallen kunnen dependency injection-frameworks (zoals Dagger, Guice en Spring) worden gebruikt om de kosten te verlagen.


Bron

제이온
제이온
제이온
제이온
[Effectieve Java] Item 4. Gebruik een private constructor om instantiatie te voorkomen Voor utility-klassen die alleen statische methoden en velden bevatten, is het een goed idee om de toegangsmodifier van de constructor op 'private' te zetten om instantiatie te voorkomen. Dit voorkomt dat gebruikers de constructor verwarren met een automat

28 april 2024

[Effectieve Java] Item 3. Garandeer singleton met een private constructor of een enum-type Drie manieren om een singleton-patroon in Java te implementeren (publieke statische leden, statische fabriekmethoden, enum-type) worden geïntroduceerd, samen met de voor- en nadelen van elke methode en voorzorgsmaatregelen bij serialisatie. De enum-type-m

27 april 2024

[Effectieve Java] Item 6. Vermijd onnodige objectcreatie Een gids over het verminderen van onnodige objectcreatie in Java. Voor onveranderlijke objecten zoals String en Boolean is het beter om literals te gebruiken, en voor reguliere expressies is het beter om Pattern-instanties te cachen. Autoboxing kan ook le

28 april 2024

Prisma Client-mocken voor unit-tests in NestJS Het verwijderen van externe afhankelijkheden is belangrijk bij het testen van eenheidstoepassingen. Met de Jest-mock-methode van Prisma ORM kunt u eenvoudig eenheidstests uitvoeren. Door het installeren van het pakket jest-mock-extended en het mocken van
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 april 2024

Conceptueel gegevensmodellering Conceptueel gegevensmodellering is het proces van het scheiden van entiteiten en het uitdrukken van relaties tussen entiteiten in een ERD. Entiteiten zijn onafhankelijke informatie-eenheden, en attributen zijn de gegevens die een entiteit bezit. Identific
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 april 2024

[Niet-technische, ontwikkelen voor een levensonderhoud] 16. Tips voor het maken van een portfolio voor beginnende ontwikkelaars Beginnende ontwikkelaars (met name niet-technische) moeten bij het maken van een portfolio niet alleen hun vaardigheden, maar ook de ontwikkelde diensten of functies duidelijk beschrijven. Bijvoorbeeld, voor een "baanzoekersgemeenschap" project, moet je c
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 april 2024

Hoe Rust concurrency-fouten voorkomt Rust is een krachtige taal die de uitdagingen van concurrency-programmeren aanpakt. Door het type-systeem en eigendomsmodel is het veilig om gegevens tussen threads te verzenden en te delen. Met behulp van interne veranderlijkheidspatronen zoals Mutex, Ch
곽경직
곽경직
곽경직
곽경직
곽경직

28 maart 2024

[Javascript] Object-structuur (V8) Het JavaScript Object wordt in de V8-engine geoptimaliseerd als een structuur afhankelijk van de toestand en werkt als een Fast-modus en een Dictionary-modus die als een hashmap werkt. De Fast-modus is snel met keys en waarden in een bijna vaste vorm, maa
곽경직
곽경직
곽경직
곽경직
곽경직

18 maart 2024

[SI-ontwikkelaarverhaal] 12. Technologieën die vaak worden gebruikt in SI-projecten De technologieën die vaak worden gebruikt in SI-ontwikkeling bij Zuid-Koreaanse MKB's zijn Java-gebaseerde Spring, Oracle DB, Mybatis, JSP, JavaScript, HTML, CSS, met Eclipse als IDE.
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

19 april 2024