मैं एक सर्वलेट लिखने की कोशिश कर रहा हूं जो "एक्शन" मूल्य के आधार पर कार्य करता है इसे इनपुट के रूप में पारित किया।
इसका नमूना यहाँ दिया गया है
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
*/
}
}
बेहतर पठनीयता और बेहतर कोड रखरखाव के लिए मेरे कोड में चेक / if-if सभी से बचने की आवश्यकता है। तो जैसे अन्य विकल्पों के लिए कोशिश की
1. स्विच केस - फिर भी यह मेरी कार्रवाई करने से पहले बहुत अधिक जांच करता है
2. प्रतिबिंब
i] एक मुख्य बात सुरक्षा है - जो मुझे इसकी पहुंच विनिर्देशक के बावजूद कक्षा के भीतर भी चर और विधियों का उपयोग करने की अनुमति देता है - मुझे यकीन नहीं है कि मौसम मैं अपने कोड में इसका उपयोग कर सकता हूं
ii] और दूसरा यह है कि अगर / तो-चेक की तुलना में सरल से अधिक समय लगता है
क्या कोई बेहतर दृष्टिकोण या बेहतर डिज़ाइन है जो कोई व्यक्ति उपरोक्त कोड को बेहतर तरीके से व्यवस्थित करने का सुझाव दे सकता है?
संपादित
मैंने नीचे दिए गए उत्तर पर विचार करते हुए उपरोक्त स्निपेट के लिए उत्तर जोड़ दिया है ।
लेकिन फिर भी, निम्न वर्ग "एक्सेकॉर्ला" और "एक्सकसोर्ब" कोड की केवल कुछ पंक्तियाँ करते हैं। क्या इसे एक विधि के रूप में जोड़ने की तुलना में एक वर्ग के रूप में जोड़ना एक अच्छा अभ्यास है? कृपया इस संबंध में सलाह दें।