Sto provando a scrivere un servlet che svolge attività in base al valore "azione" e lo ha passato come input.
Ecco il campione di cui
public class SampleClass extends HttpServlet {
public static void action1() throws Exception{
//Do some actions
}
public static void action2() throws Exception{
//Do some actions
}
//And goes on till action9
public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
String action = req.getParameter("action");
/**
* I find it difficult in the following ways
* 1. Too lengthy - was not comfortable to read
* 2. Makes me fear that action1 would run quicker as it was in the top
* and action9 would run with a bit delay - as it would cross check with all the above if & else if conditions
*/
if("action1".equals(action)) {
//do some 10 lines of action
} else if("action2".equals(action)) {
//do some action
} else if("action3".equals(action)) {
//do some action
} else if("action4".equals(action)) {
//do some action
} else if("action5".equals(action)) {
//do some action
} else if("action6".equals(action)) {
//do some action
} else if("action7".equals(action)) {
//do some action
} else if("action8".equals(action)) {
//do some action
} else if("action9".equals(action)) {
//do some action
}
/**
* So, the next approach i tried it with switch
* 1. Added each action as method and called those methods from the swith case statements
*/
switch(action) {
case "action1": action1();
break;
case "action2": action2();
break;
case "action3": action3();
break;
case "action4": action4();
break;
case "action5": action5();
break;
case "action6": action6();
break;
case "action7": action7();
break;
case "action8": action8();
break;
case "action9": action9();
break;
default:
break;
}
/**
* Still was not comfortable since i am doing un-necessary checks in one way or the other
* So tried with [reflection][1] by invoking the action methods
*/
Map<String, Method> methodMap = new HashMap<String, Method>();
methodMap.put("action1", SampleClass.class.getMethod("action1"));
methodMap.put("action2", SampleClass.class.getMethod("action2"));
methodMap.get(action).invoke(null);
/**
* But i am afraid of the following things while using reflection
* 1. One is Security (Could any variable or methods despite its access specifier) - is reflection advised to use here?
* 2. Reflection takes too much time than simple if else
*/
}
}
Tutto ciò di cui ho bisogno è fuggire da troppi controlli if / else-if nel mio codice per una migliore leggibilità e una migliore manutenzione del codice. Così provato per altre alternative come
1. cambia caso - fa ancora troppi controlli prima di fare la mia azione
2. riflessione
i] una cosa principale è la sicurezza - che mi consente di accedere anche alle variabili e ai metodi all'interno della classe nonostante il suo identificatore di accesso - non sono sicuro del tempo che potrei usare nel mio codice
ii] e l'altro è che richiede più tempo dei semplici controlli if / else-if
Esiste un approccio migliore o una progettazione migliore che qualcuno potrebbe suggerire di organizzare il codice sopra riportato in un modo migliore?
MODIFICATO
Ho aggiunto la risposta per lo snippet sopra considerando la risposta di seguito .
Tuttavia, le seguenti classi "ExecutorA" e "ExecutorB" eseguono solo poche righe di codice. È una buona pratica aggiungerli come classe piuttosto che aggiungerlo come metodo? Si prega di avvisare al riguardo.