if/else स्टेटमेंट की तरह switch स्टेटमेंट से भी आप शर्त के अनुसार कोड चलाकर प्रोग्राम का प्रवाह बदल सकते हैं।
फर्क इतना है कि switch स्टेटमेंट केवल किसी प्रिमिटिव या स्ट्रिंग एक्सप्रेशन की वैल्यू की तुलना पहले से तय स्थिर वैल्यू से कर सकता है।
स्विच स्टेटमेंट इस्तेमाल करते समय कुछ कीवर्ड काम आते हैं।
switch: इस कीवर्ड से आप स्विच का ढाँचा घोषित करते हैं।
इसके बाद वह एक्सप्रेशन या वेरिएबल लिखा जाता है जिसकी वैल्यू से परिणाम बदलेगा।case: इससे आप परिणाम की अलग-अलग संभावनाएँ घोषित करते हैं।break: जहाँ तक कोड चलाना है वहाँ पहुँचकर switch को रोकने के लिए break कीवर्ड बहुत काम आता है।
अगर आप इसे भूल जाते हैं तो प्रोग्राम आगे चलता रहेगा और परिणाम अनपेक्षित हो सकता है।default: जैसा कि नाम से ही पता चलता है, जब आपके एक्सप्रेशन के परिणाम से कोई और केस मेल न खाए तो इसे डिफॉल्ट के तौर पर इस्तेमाल कीजिए।सबसे सादे रूप में ये किसी प्रिमिटिव या स्ट्रिंग एक्सप्रेशन की जाँच करते हैं और उसकी वैल्यू के आधार पर फैसला लेते हैं। उदाहरण:
String direction = getDirection();
switch (direction) {
case "left":
goLeft();
break;
case "right":
goRight();
break;
default:
// otherwise
markTime();
break;
}
Java 14 से (इससे पहले Java 12 और 13 में यह प्रीव्यू के तौर पर उपलब्ध था) एन्हांस्ड स्विच इम्प्लीमेंटेशन इस्तेमाल करना संभव है।
आप एक ही केस में कई वैल्यू असाइन कर सकते हैं।
पारंपरिक स्विच स्टेटमेंट में आप फॉल-थ्रू का उपयोग कर सकते हैं। नीचे के उदाहरण में case 1 और case 3 एक ही काम करेंगे।
ऐसा इसलिए है क्योंकि case 1 में break कीवर्ड नहीं लिखा गया है।
switch (number) {
case 1:
case 3:
// do same stuff
break;
case 2:
// do different stuff
break;
// (...)
}
एन्हांस्ड switch expression में आप सीधे एक case को कई वैल्यू असाइन कर सकते हैं।
नीचे का उदाहरण देखिए:
switch (number) {
case 1, 3:
// do stuff
break;
case 2:
// do other stuff
break;
// (...)
}
अब आप switch-statement या switch expression लिख सकते हैं।
फर्क क्या है?
मोटे तौर पर स्टेटमेंट से सख्त तर्क की उम्मीद होती है, जबकि एक्सप्रेशन एक वैल्यू लौटा सकता है।
इसके बजाय:
String result = "";
switch (expression) {
case "bob":
result = "bob";
break;
// (...)
}
आप यह कर सकते हैं:
String result = switch (expression) {
case "bob":
yield "bob";
// (...)
}
yield एक return की तरह काम करता है, बस यह स्विच एक्सप्रेशन के लिए है।
चूँकि yield ही एक्सप्रेशन को खत्म कर देता है, यहाँ break की जरूरत नहीं पड़ती।
स्विच स्टेटमेंट और स्विच एक्सप्रेशन के बीच एक और फर्क: स्विच एक्सप्रेशन में आपको हर हाल में सारे केस कवर करने होंगे।
या तो हर संभव वैल्यू के लिए एक case रखकर, या default केस इस्तेमाल करके।
: की जगह -> इस्तेमाल कर सकते हैं।
-> लगाने पर break कीवर्ड लिखने की जरूरत नहीं पड़ती।
दोनों तरीके चल सकते हैं, लेकिन एक ही स्विच में किसी एक पर टिके रहना होगा।
switch(expression) {
case 1 -> yield "one"
case 2 -> yield "two"
default: yield "other number" // Removing this will result in a compile error
}
स्कोप।
पारंपरिक switch में पूरे switch के लिए एक ही स्कोप होता है, इसलिए इसके स्कोप की वजह से कभी-कभी अनपेक्षित व्यवहार हो सकता है।
switch(expression) {
case 1:
String message = "something";
break;
case 2:
String message = "anything";
break;
// (...)
}
यह उदाहरण काम नहीं करता, क्योंकि switch में message दो बार घोषित किया गया है।
इसे इस तरह हल किया जा सकता है:
switch (expression) {
case 1: {
String message = "something";
break;
}
case 2: {
String message = "anything";
break;
}
// (...)
}
क्योंकि {} उस case का स्कोप तय करते हैं।
लेकिन यह तरीका स्वाभाविक नहीं लगता, क्योंकि {} लगाना जरूरी नहीं है।
वहीं अगर आप नया -> इस्तेमाल करते हैं, तो उसके बाद इनमें से कोई एक चीज जरूर आनी चाहिए: एक अकेला स्टेटमेंट या एक्सप्रेशन, एक throw स्टेटमेंट, या {} ब्लॉक।
अब कोई उलझन नहीं!
एन्हांस्ड स्विच के बारे में ज़्यादा जानकारी इस लेख और इस लेख में मिलेगी, साथ ही आधिकारिक Oracle डॉक्युमेंटेशन में भी।
इसके अलावा, Java 21 में Guarded Patterns नाम का एक फीचर जोड़ा गया, जिससे आप केस लेबल में ही जाँच कर सकते हैं।
String dayOfMonth = getDayOfMonth();
String day = "";
return switch (day) {
case "Tuesday" when dayOfMonth == 13 -> "Forbidden day!!";
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" -> "Week day";
case "Saturday", "Sunday" -> "Weekend";
default -> "Unknown";
};
Java 21 में स्विच एक्सप्रेशन के बारे में ज़्यादा जानकारी आप इस ब्लॉग में पा सकते हैं।