Ho una classe Java astratta "BaseOperation". Questa classe ha un solo metodo astratto:Un metodo java con tipo di ritorno variabile e argomenti di input variabili
public abstract T execute()
{
...
return T;
}
sottoclassi di BaseOperation deve implementare questo metodo:
public class GetUsersOperation extends BaseOperation<GetUsersResponse>
{
...
@Override
public GetUsersResponse execute()
{
...
return GetUsersResponse;
}
}
Questo è un ottimo modo per mettere tutti comuni logica "operazione" nella classe BaseOperation
, ma avere ancora il metodo execute()
della sottoclasse in calcestruzzo con un tipo di restituzione diverso.
Ora ho bisogno di cambiare questa struttura per consentire ai metodi execute() di avere una quantità variabile di argomenti. Per esempio, una sottoclasse concreta richiederebbe:
execute(String, int)
e un altro avrebbe bisogno:
execute(Date, Date, String)
Questo è difficile, perché il metodo execute viene dichiarato nella classe base. Semplicemente sovraccaricare i metodi di esecuzione nella base non è l'ideale. In primo luogo, la quantità di sovraccarichi sarebbe enorme. In secondo luogo, ogni sottoclasse utilizzerà sempre solo uno dei metodi di esecuzione, qual è il punto di tutti gli altri?
L'(a mio parere) soluzione più semplice sarebbe quella di dichiarare il metodo execute con varargs:
execute(Object... arguments)
E poi downcast tutti gli argomenti nelle sottoclassi:
execute(Object... arguments)
{
String s = (String) arguments[0];
...
}
Ovviamente questo ha 2 principali Svantaggi:
- Prestazioni ridotte a causa di tutte le operazioni downcasting
- La chiamata dei metodi
execute()
non è più strettamente immessa perché è possibile passare qualsiasi quantità di oggetti senza avvisi del compilatore.
Esistono modelli o altre soluzioni che potrebbero non avere questi svantaggi?
Mi piace come la logica relativa all'input richiesto sia codificata come attributi (campi) della sottoclasse stessa (con i metodi set necessari), piuttosto che come una classe bean separata. Tuttavia, non c'è nulla che mi impedisce di chiamare execute() senza aver impostato i parametri appropriati. Questo può essere risolto? – user1884155
@ user1884155 Sì, passare argomento nel costruttore di operazioni, vedere la mia modifica;) – NiziL
Ah, ovviamente. Preferisco questa soluzione rispetto alla "semplice" soluzione javabean perché sono richiesti tutti i miei parametri e non voglio introdurre una classe bean aggiuntiva per ogni classe di operazioni che creo. Grazie! – user1884155