Costruttori e getter per implementare il metodo di template con dipendenze invarianti?

0

Supponiamo che mi piacerebbe implementare il modello di template, ma le uniche reali differenze tra le sottoclassi sono le loro scelte di alcune dipendenze invarianti.

C'è uno svantaggio a preferire questo stile:

public abstract class AbstractClass {
    private final DependencyA dependencyA;
    private final DependencyB dependencyB;

    public AbstractClass(final DependencyA dependencyA, final DependencyB dependencyB) {
        this.dependencyA = dependencyA;
        this.dependencyB = dependencyB;
    }

    public void doStuffWithDeps() {
        //Business logic using the dependency fields
    }
}

A questo stile?

public abstract class AbstractClass {
    protected abstract DependencyA getDependencyA();
    protected abstract DependencyB getDependencyB();

    public void doStuffWithDeps() {
        //Business logic using the dependency getters
    }
}

Non ho molta esperienza nell'usare il primo dei due, ma direi che nei casi in cui le dipendenze non cambiano nel tempo, il primo è preferito in quanto non vi è alcun motivo per continuare a chiedere le dipendenze per ogni chiamata al metodo doStuffWithDeps() . Tuttavia, ogni volta che ho visto questo tipo di problema è sempre stato risolto con la seconda implementazione, il che mi fa pensare se mi sia sfuggito qualcosa.

Comprendo che l'ereditarietà non è in realtà una buona soluzione a questo tipo di problemi, ma supponiamo che queste siano le mie due opzioni, quale preferisco e perché?

    
posta kinbiko 20.01.2018 - 16:30
fonte

3 risposte

1

Se le sottoclassi della tua classe astratta utilizzeranno l'iniezione sul campo, è molto più semplice per loro se usi il secondo stile.

Con il primo stile devono in costruttore darti qualcosa anche se non hanno ancora la loro dipendenza. Quindi ti danno il proxy. Tale proxy cambierà il comportamento da non iniettato iniettato a iniettare al termine della fase di iniezione.

Quindi quello che pensavi ti ha dato immutabilità non ti ha dato nulla di più del secondo approccio.

    
risposta data 22.01.2018 - 15:10
fonte
0

La domanda chiave qui è che vuoi che le istanze di AbstractClass siano immutabili o meno. In altre parole vuoi un oggetto, una volta che è istanziato non essere in grado di cambiare le sue dipendenze. Se è così, vai con il primo metodo, altrimenti il secondo.

Se è lo stesso per la tua situazione, rendila immutabile. Gli oggetti immutabili rendono il codice di lettura molto più semplice e non consentono di apportare modifiche accidentali all'oggetto da qualche parte più avanti nel codice tramite il suo riferimento. Un altro punto per immutabile è che in questo modo gli oggetti sono strettamente definiti dalle loro dipendenze e sai cosa aspettarti da allora in tutte le situazioni.

    
risposta data 20.01.2018 - 17:24
fonte
0

Bene, se è un inconveniente o un vantaggio dipende dal tuo intento. Il primo esempio è una costruzione standard per l'iniezione delle dipendenze.

Se le dipendenze devono essere in grado di cambiare durante il ciclo di vita di una determinata istanza, utilizzare il secondo esempio. Di nuovo, se è un vantaggio o uno svantaggio dipende da cosa devi fare.

    
risposta data 20.01.2018 - 18:49
fonte

Leggi altre domande sui tag