बहुत सारी शर्तों के साथ कोड लिखते समय, निश्चित रूप से आपने या तो if-else या स्विच स्टेटमेंट का उपयोग किया होगा। लेकिन अगर-बाकी के इस विकल्प में कमियां हैं। कुछ लोगों ने स्विच स्टेटमेंट को "एंटी-पैटर्न" भी कहा है।
वह क्या है? एक एंटी-पैटर्न खराब कोड का एक सामान्य पैटर्न है, यानी किसी समस्या का खराब समाधान। प्रोग्रामर उनसे कोड में बचने की कोशिश करते हैं, क्योंकि वे कोड की गुणवत्ता को कम करते हैं। |
लेकिन अच्छी खबर है: जावा के नए संस्करणों ने भाषा के वाक्य-विन्यास में बहुत सारे बदलाव लाए हैं, और उनमें से एक परिवर्तन स्विच को प्रभावित करता है । साजिश हुई? तो चलिए गोता लगाते हैं।
आरंभ करने के लिए, यह स्पष्ट करने योग्य है कि स्विच एक प्रतिमान क्यों है। निम्नलिखित कोड पर विचार करें:
switch (condition) {
case "DECEMBER":
seasonNumber = 1;
break;
case "JANUARY":
seasonNumber = 1;
break;
case "FEBRUARY":
seasonNumber = 1;
break;
default:
seasonNumber = 0;
}
ठीक है, तो यह अभी तक पूरी तरह स्पष्ट नहीं है कि यह एक "विरोधी पैटर्न" क्यों है।
लेकिन क्या होगा अगर हम और केस ब्लॉक जोड़ते हैं और अब कोड इस तरह दिखता है:
switch (condition) {
case "DECEMBER":
seasonNumber = 1;
break;
case "JANUARY":
seasonNumber = 1;
break;
case "FEBRUARY":
seasonNumber = 1;
break;
case “MARCH”:
seasonNumber = 2;
break;
case “APRIL”:
seasonNumber = 2;
break;
case “MAY”:
seasonNumber = 2;
break;
default:
seasonNumber = 0;
}
आइए कुछ और पंक्तियाँ जोड़ें — कोड लंबा हो जाता है। बाद में हम अधिक से अधिक पंक्तियाँ जोड़ सकते हैं, और कोई भी हमें ऐसा करने से नहीं रोकेगा।
यह समस्या की जड़ है: शुरू में एक कॉम्पैक्ट स्विच स्टेटमेंट बनाने के बाद, हम इसमें अधिक से अधिक कोड जोड़ते हैं, अधिक से अधिक जगह लेते हैं - स्क्रीन पर फिट होने से अधिक - और कोड को पढ़ने और बनाए रखने के लिए असुविधाजनक बनाते हैं।
स्विच स्टेटमेंट और स्विच एक्सप्रेशन के बीच अंतर
जावा 14 ने एक नया और बेहतर स्विच पेश किया। यह एक स्विच स्टेटमेंट नहीं है , बल्कि एक स्विच एक्सप्रेशन है ।
क्या अंतर है, तुम पूछो? अंतर यह है कि एक बयान एक निर्देश है जो संचालन का एक निश्चित सेट करता है, लेकिन एक अभिव्यक्ति कोड का एक टुकड़ा है जो कुछ गणना करता है और परिणाम देता है।
दूसरे शब्दों में, अब आप एक परिवर्तन के परिणाम को एक चर में सहेज सकते हैं।
काफी बात हो रही है। अब देखते हैं कि नया स्विच कैसा दिखता है:
var result = switch(month) {
case DECEMBER, JANUARY, FEBRUARY -> 1;
case MARCH, APRIL, MAY -> 2;
case JUNE, JULY, AUGUST -> 3;
case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
default -> 0;
};
पहली चीज जो आपकी आंख को पकड़ती है वह यह है कि कोड कितना कॉम्पैक्ट है। कोड जो अधिकांश स्क्रीन को घेरता था, अब कुछ पंक्तियों में फैला हुआ है और अधिक पठनीय लगता है।
-> ऑपरेटर
आपको -> ऑपरेटर (एरो ऑपरेटर) पर भी ध्यान देना चाहिए। यदि आपके पास लैम्ब्डा एक्सप्रेशन के साथ अनुभव है तो आप इससे पहले ही परिचित हो सकते हैं।
इसका मतलब है कि अब आप लैम्ब्डा स्टेटमेंट की शैली में एक अच्छा दिखने वाला स्विच लिख सकते हैं । एरो ऑपरेटर इंगित करता है कि कंपाइलर अगले केस एक्सप्रेशन पर आगे नहीं बढ़ेगा (यदि वर्तमान केस ब्लॉक में ब्रेक या रिटर्न स्टेटमेंट की कमी है), लेकिन इसके बजाय आपको एरो के दाईं ओर एक्सप्रेशन का मान देगा।
आप कोड भी लिख सकते हैं जो एक अभिव्यक्ति नहीं है और कुछ भी वापस करने के बजाय केवल कुछ क्रियाएं करता है:
switch(condition) {
case TRUE, FALSE -> System.out.println("True/false");
default -> System.out.println("Another");
}
ध्यान दें कि स्विच में अब ब्रेक स्टेटमेंट नहीं है। इसे जावा 13 में हटा दिया गया था और उपज के साथ बदल दिया गया था ।
उपज क्या है और इसका उपयोग कहाँ किया जा सकता है?
जब एक स्विच में एक लाइन होती है, तो -> ऑपरेटर स्वयं मान लौटाता है। लेकिन क्या होगा अगर हमारे पास कोड की एक नहीं, बल्कि कई लाइनें हों? ऐसे मामलों में, तीर ऑपरेटर एक मान नहीं लौटाएगा, क्योंकि एक नहीं, बल्कि कई पंक्तियाँ हैं।
शायद हम वापसी का उपयोग कर सकते हैं ? आखिरकार, इसका उपयोग जावा में मान वापस करने के लिए किया जाता है। काश, नहीं, वापसी स्विच के साथ काम नहीं करती। तो हम क्या उपयोग कर सकते हैं? ब्रेक हुआ करता था , लेकिन जावा 13 में इसे हटा दिया गया था। लेकिन इसके स्थान पर अब हमारे पास यील्ड है - एक नया कीवर्ड जो आपको स्विच से मूल्य वापस करने में मदद करता है। यह मेथड में रिटर्न स्टेटमेंट के समान है ।
var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};
इस कोड में एक ही लाइन है, और -> ऑपरेटर "ग्रीटिंग" लौटाएगा।
लेकिन जब हमारे पास कोड का एक ब्लॉक होता है:
var result = switch(condition) {
//…
case "Hi" -> {
// Your code
Here you need to return "greeting"
}
};
वह कीवर्ड जो आपको मूल्य वापस करने में मदद करेगा वह है उपज :
var result = switch(condition) {
//…
case "Hi" -> {
// Your code
yield "greeting";
}
};
उपज जावा 13 में उन मामलों के लिए जोड़ा गया था जहां हमारे पास केस ब्लॉक में कोड की एक से अधिक पंक्तियां हैं और हमें परिणाम वापस करने की आवश्यकता है।
आप शायद अपने कोड में नए स्विच को आज़माने के लिए उत्सुक हैं , लेकिन याद रखें कि ऐसा करने के लिए आपको Java 14 या उच्चतर की आवश्यकता होगी। पहले के संस्करणों के साथ, यह स्विच केवल तभी उपलब्ध होगा जब आप कमांड लाइन पर "--सक्षम-पूर्वावलोकन" ध्वज निर्दिष्ट करते हैं, क्योंकि संस्करण 14 से पहले यह तकनीकी पूर्वावलोकन का हिस्सा था, न कि भाषा का पूर्ण भाग।
अभी के लिए इतना ही! फिर मिलते हैं!
GO TO FULL VERSION