Perché utilizzare la riflessione? Perché non è sufficiente:
SampleClass action = new SampleClass();
action.setRequest(request);
che fa la stessa cosa, ma è più leggibile, consente al compilatore di verificare che in realtà esistono i tipi e metodi, si dà Javadoc per il metodo invocato, permette il vostro IDE per aiutare a refactoring, ...
E ancora è l'iniezione di dipendenza, perché l'azione non va in cerca della sua richiesta, ma riceve la richiesta durante l'inizializzazione.
Modifica: Thorbjørn ha richiesto di mostrare come questa azione sarebbe stata utilizzata. Sarebbe esso stesso iniettato (usando un setter) in qualunque componente utilizzasse l'azione. Il componente utilizzerà quindi l'oggetto azione iniettato.
SampleClass action = new SampleClass();
action.setRequest(request);
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);
Se servlet
destinato a vivere più a lungo action
, cioè esso dovrebbe utilizzare un nuovo Action
ogni volta che deve uno, si può invece setter-iniettare un ActionFactory
in servlet
.
In questo caso concreto, mi chiedevo se l'azione ha davvero bisogno di mantenere una richiesta come parte del suo stato, o può essere immutabile e semplicemente agire sulla richiesta passata dal Servlet come parametro del metodo.In tal caso, l'inizializzazione all'avvio farebbe:
SampleClass action = new SampleClass();
Servlet servlet = new ActionBasedServlet();
servlet.setAction(action);
e ActionBasedServlet
definirebbe
public void serve(Request req, Response resp) {
foo();
action.act(req, resp);
bar();
}
Mi piace il termine "per magia". Come sta avvenendo l'inizializzazione. Come è fatto in primavera o in simili contenitori DI. –
L'idea è di spostare l'inizializzazione lontano dalla classe iniettata e dalla classe in cui avviene l'iniezione, in modo che non sappiano come accade. Il punto in cui si sposta il codice di iniezione è quindi dipendente dall'implementazione e, in pratica, non è necessario conoscere. Alla fine si usa il reflection ma è come dire che Hibernate sta usando JDBC alla fine. –
La mia intenzione è di passare l'oggetto richiesta a diverse classi di controller dinamicamente da un filtro dispatcher, dove otteniamo oggetti di richiesta e risposta. –