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é?