
Originariamente inviata da
fermat
farli astratti e da implementare nella sottoclasse non ha molto senso, farebbero la stessa cosa.
non so se riesco a farvi capire il mio dubbio!
Se i due controller devono comportarsi allo stesso modo, allora ripeto tutto (campi, initialize() ecc..) va messo nella superclasse!
Ti faccio invece un esempio di "specializzazione" oltre al getToken. Immagina che appena dopo aver letto la lista da JSON con il readJson vuoi fare delle operazioni particolari sulla lista, che so ... rimuovere oggetti che non ritieni validi, impostare/inizializzare altro negli oggetti Author/Editor, ecc...
Nella superclasse farai:
codice:
public class ControllerAuthorEditor<T> {
// ....
public void initialize() {
// ....
List<T> list = jsonRead.readJson( ...... );
list = postRead(list);
// ....
}
// ....
protected List<T> postRead(List<T> input) {
return input; // NOP, no operation
}
}
Con il postRead ti sei "aperto" la possibilità di far fare ad una sottoclasse qualcosa di particolare sulla lista appena dopo la lettura.
In ControllerAuthorEditor non fa nulla di particolare, restituisce la stessa lista e basta.
In ControllerAuthor potresti fare es.
codice:
public class ControllerAuthor extends ControllerAuthorEditor<Author> {
// .... getToken()
@Override
protected List<Author> postRead(List<Author> input) {
Iterator<Author> iter = input.iterator();
while (iter.hasNext()) {
Author author = iter.next();
if (author.getName() == null) {
iter.remove(); // rimuove un Author senza name
}
}
return input;
}
}
Ora ti è chiara la "flessibilità" di questa cosa?