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

Questo è un post tradotto da IA.

제이온

[Effettivi Java] Elemento 5. Non dichiarare risorse, utilizzare l'iniezione di dipendenze

Seleziona la lingua

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

Testo riassunto dall'intelligenza artificiale durumis

  • Se una classe dipende internamente da una o più risorse, è meglio non utilizzare classi di utilità statiche o classi singleton, ma utilizzare l'iniezione di dipendenze.
  • L'utilizzo dell'iniezione di dipendenze può migliorare la flessibilità, la riusabilità e la facilità di test della classe e le risorse possono essere iniettate tramite costruttori, fabbriche statiche, builder, ecc.
  • L'iniezione di dipendenze può essere utilizzata passando la risorsa stessa o una fabbrica di risorse, e per i progetti con molte dipendenze, è efficiente utilizzare un framework di dipendenze.

Se si scopre che una classe dipende internamente da una o più risorse e che tali risorse influenzano il comportamento della classe, è preferibile non utilizzare classi di utilità statiche o singleton.


Non dovresti nemmeno far sì che la classe crei queste risorse direttamente. Piuttosto, è preferibile passare le risorse necessarie al costruttore. L'iniezione di dipendenze può migliorare la flessibilità, la riusabilità e la facilità di test della classe.


Esempio

Esempio di utilizzo di una classe di utilità statica

public class SpellChecker {

    private static final Lexicon dictionary = new Lexicon();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // logica che utilizza il dizionario
    }

    public static List suggestions(String typo) {
        // logica che utilizza il dizionario
    }

Questa classe di utilità presuppone che venga utilizzato un solo dizionario. Tuttavia, in realtà, i dizionari possono essere diversi a seconda della lingua e, a volte, è possibile avere un dizionario separato per vocaboli speciali.


Esempio di utilizzo di una classe singleton

public class SpellChecker {

    private final Lexicon dictionary = new Lexicon();

    public static SpellChecker INSTANCE = new SpellChecker();

    private SpellChecker() {
    }

    public static boolean isValid(String word) {
        // logica che utilizza il dizionario
    }

    public static List suggestions(String typo) {
        // logica che utilizza il dizionario
    }


Anche la classe singleton presuppone che venga utilizzato un solo dizionario, quindi si verificano gli stessi svantaggi di cui sopra.


Soluzione 1 - Rimuovere la parola chiave final dal campo.

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 che utilizza il dizionario
    }

    public static List suggestions(String typo) {
        // logica che utilizza il dizionario
    }


È possibile rimuovere la parola chiave final dal dizionario della classe di utilità statica o singleton e consentire al codice esterno di sostituire il dizionario con un dizionario diverso. Tuttavia, questo metodo è scomodo da usare e può causare problemi di concorrenza in un ambiente multi-thread.


Soluzione 2 - Utilizzare l'iniezione di dipendenze.

public class SpellChecker {

    private final Lexicon dictionary;

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

    public static boolean isValid(String word) {
        // logica che utilizza il dizionario
    }

    public static List suggestions(String typo) {
        // logica che utilizza il dizionario
    }


Tramite l'esempio precedente, possiamo capire che le classi statiche e le classi singleton non dovrebbero dipendere da risorse interne. Ciò significa che è preferibile iniettare risorse esterne.


La classe che utilizza l'iniezione di dipendenze garantisce l'immutabilità grazie alla parola chiave final e offre il vantaggio di supportare più istanze di risorse. Inoltre, l'iniezione di dipendenze può essere applicata non solo al costruttore, ma anche alle fabbriche statiche e ai costruttori.


L'iniezione di dipendenze non si limita a passare la risorsa stessa, ma spesso si usa anche il metodo di passaggio della factory della risorsa. Una factory è un oggetto che crea ripetutamente istanze di un determinato tipo quando viene chiamato. Questo metodo è chiamato pattern factory method e Supplier in Java 8 è un perfetto esempio di factory.


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


Di solito, un tipo di carattere jolly limitato viene utilizzato per limitare il parametro di tipo della factory. Utilizzando questo metodo, il client può passare qualsiasi factory che sia un sottotipo del tipo specificato dal client.


L'iniezione di dipendenze migliora la flessibilità e la facilità di test, ma può essere costosa per progetti con un'elevata dipendenza. In questi casi, è possibile utilizzare un framework di iniezione di dipendenze (Dagger, Guice, Spring, ecc.) per ridurre i costi.


Fonte

제이온
제이온
제이온
제이온
[Effective Java] Item 1. Consider static factory methods instead of constructors I metodi di fabbrica statici sono un modo flessibile ed efficiente per creare istanze invece di costruttori. Possono avere un nome, restituire istanze che soddisfano determinate condizioni e migliorare le prestazioni tramite il caching. A differenza del m

27 aprile 2024

[Effective Java] Elemento 3. Garantisci il singleton con un costruttore privato o un tipo di enumerazione Presenta tre modi per implementare il modello singleton in Java (membro statico pubblico, metodo di fabbrica statico, tipo di enumerazione) e spiega i pro e i contro di ciascun metodo e le precauzioni da prendere durante la serializzazione. Si consiglia d

27 aprile 2024

[Effective Java] Item 4. Utilizzare un costruttore privato per impedire l'istanziamento Per le classi di utilità che includono solo metodi e campi statici, è consigliabile impostare l'accesso al costruttore su privato per impedire l'istanziamento. Ciò impedisce agli utenti di creare istanze della classe in modo errato, in quanto si basano su

28 aprile 2024

Come Rust impedisce i bug di concorrenza Rust è un linguaggio potente che affronta le sfide della programmazione concorrente. Il suo sistema di tipi e il modello di proprietà garantiscono la sicurezza nella condivisione e nel trasferimento di dati tra thread. Tramite pattern di mutabilità intern
곽경직
곽경직
곽경직
곽경직
곽경직

28 marzo 2024

Modellazione concettuale dei dati La modellazione concettuale dei dati è il processo di separazione delle entità e di rappresentazione delle relazioni tra le entità tramite un ERD. Un'entità è un'unità di informazioni indipendente, mentre gli attributi sono i dati detenuti dall'entità. Gl
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

8 aprile 2024

[Non-major, sopravvivere come sviluppatore] 7. Cosa aiuta e cosa no quando si cerca un lavoro nel settore Quando ci si prepara a cercare lavoro come sviluppatore, il blog tecnologico è inefficiente, mentre GitHub è consigliato per la gestione dei progetti e la condivisione del codice sorgente. Tra le varie certificazioni, è consigliabile preparare l'esame per
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

29 marzo 2024

Cosa testare nello sviluppo di app per una persona? Scopri come stabilire la priorità dei test durante lo sviluppo di app e creare una strategia di test efficiente. L'autore suggerisce di dare la priorità ai test umani, ai test di integrazione, ai test unitari e ai test di accettazione/widget in quest'ordi
Alien Story
Alien Story
Alien Story
Alien Story
Alien Story

16 maggio 2024

Mocking Prisma Client per test unitari in NestJS Quando si eseguono test unitari su un'applicazione, è fondamentale eliminare le dipendenze esterne. È possibile eseguire test unitari in modo semplice utilizzando il metodo di mocking Jest di Prisma ORM. Installando il pacchetto jest-mock-extended, è poss
제이의 블로그
제이의 블로그
제이의 블로그
제이의 블로그

2 aprile 2024

[Non specialisti, sopravvivere come sviluppatori] 14. Riepilogo dei contenuti del colloquio tecnico per sviluppatori junior Questa è una guida alla preparazione ai colloqui tecnici per sviluppatori junior. Copre argomenti come la memoria principale, le strutture dati, RDBMS e NoSQL, programmazione procedurale e orientata agli oggetti, override e overload, algoritmi di sostituz
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

3 aprile 2024