Cercherò di spiegare al meglio.Come utilizzare una classe generica con oggetti specifici in un contesto statico?
Uso Play Framework 2 e eseguirò molte azioni CRUD. Alcuni di loro saranno identici, quindi mi piacerebbe KISS e ASCIUTO quindi all'inizio pensavo a una classe astratta contenente i metodi list
, details
, create
, update
e , con oggetto generico ed estendere questa classe specificando quale oggetto da utilizzare (modello & Form):
public abstract class CrudController extends Controller {
protected static Model.Finder<Long, Model> finder = null;
protected static Form<Model> form = null;
public static Result list() {
// some code here
}
public static Result details(Long id) {
// some code here
}
public static Result create() {
// some code here
}
public static Result update(Long id) {
// some code here
}
public static Result delete(Long id) {
// some code here
}
}
e una classe che utilizzerà CRUD:
public class Cities extends CrudController {
protected static Model.Finder<Long, City> finder = City.find;
protected static Form<City> form = form(City.class);
// I can override a method in order to change it's behavior :
public static Result list() {
// some different code here, like adding some where condition
}
}
questo funzionerebbe se non ero in un contesto statico.
Ma visto che è il caso, come posso fare?
Perché non passare semplicemente ai metodi di istanza? L'ereditarietà non funziona sui metodi di classe in Java. – Vlad
Un'altra idea potrebbe essere quella di sostituire l'ereditarietà con la composizione: basta disporre delle istanze di CrudController e delegare le operazioni all'oggetto contenuto specifico dell'istanza. (Tutto dipende dal tuo design, ovviamente.) – Vlad
@Vlad: per la prima domanda, non posso, Play richiede un metodo statico per il controller. Ora per il secondo, non sono sicuro di capire, potresti elaborare (o creare una nuova risposta)? –