बर्‍याच अटींसह कोड लिहिताना, तुम्ही एकतर if-else किंवा switch स्टेटमेंट वापरले असेल. पण if-else च्या या पर्यायामध्ये तोटे आहेत. काही लोकांनी स्विच स्टेटमेंटला "अँटी-पॅटर्न" देखील म्हटले आहे .

ते काय आहे? अँटी-पॅटर्न हा खराब कोडचा एक सामान्य नमुना आहे, म्हणजे समस्येचे वाईट निराकरण. प्रोग्रामर त्यांना कोडमध्ये टाळण्याचा प्रयत्न करतात, कारण ते कोडची गुणवत्ता खराब करतात.

पण एक चांगली बातमी आहे: Java च्या नवीन आवृत्त्यांनी भाषेच्या वाक्यरचनेत बरेच बदल केले आहेत आणि त्यापैकी एक बदल स्विचवर परिणाम करतो . उत्सुकता आहे? चला तर मग आत जाऊ.

सुरुवातीला, स्विच हा अँटी-पॅटर्न का आहे हे स्पष्ट करणे योग्य आहे. खालील कोड विचारात घ्या:


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;
}

चला आणखी काही ओळी जोडूया — कोड जास्त वाढतो. नंतर आपण अधिकाधिक ओळी जोडू शकतो आणि कोणीही आपल्याला हे करण्यापासून रोखणार नाही.

हे समस्येचे मूळ आहे: सुरुवातीला कॉम्पॅक्ट स्विच स्टेटमेंट तयार केल्यानंतर, आम्ही त्यात अधिकाधिक कोड जोडतो, अधिकाधिक जागा घेतो — स्क्रीनवर बसेल त्यापेक्षा जास्त — आणि कोड वाचण्यासाठी आणि राखण्यासाठी गैरसोयीचा बनवतो.

स्विच स्टेटमेंट आणि स्विच एक्सप्रेशनमधील फरक

Java 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");
}

लक्षात ठेवा की स्विचमध्ये यापुढे ब्रेक स्टेटमेंट नाही . ते Java 13 मध्ये काढले गेले आणि उत्पन्नाने बदलले .

उत्पन्न म्हणजे काय आणि ते कुठे वापरले जाऊ शकते?

जेव्हा स्विचमध्ये एक ओळ असते, तेव्हा -> ऑपरेटर स्वतः मूल्य परत करतो. पण आपल्याकडे कोडच्या एक नसून अनेक ओळी असतील तर? अशा प्रकरणांमध्ये, बाण ऑपरेटर मूल्य परत करणार नाही, कारण एक नव्हे तर अनेक ओळी आहेत.

कदाचित आम्ही रिटर्न वापरू शकतो ? शेवटी, हे Java मध्ये मूल्ये परत करण्यासाठी वापरले जाते. अरेरे, नाही, रिटर्न स्विचसह कार्य करणार नाही. मग आपण काय वापरू शकतो? आधी ब्रेक असायचे , पण ते Java 13 मध्ये काढून टाकण्यात आले. पण त्याच्या जागी आता आमच्याकडे yield आहे — एक नवीन कीवर्ड जो तुम्हाला स्विचमधून व्हॅल्यू परत करण्यास मदत करतो. पद्धतींमध्ये विधाने परत करणे हे समान आहे .


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";

	}
};

Java 13 मध्ये आमच्याकडे केस ब्लॉकमध्ये कोडच्या एकापेक्षा जास्त ओळी आहेत आणि आम्हाला निकाल देणे आवश्यक आहे अशा प्रकरणांसाठी yield जोडले गेले.

तुम्ही कदाचित तुमच्या कोडमधील नवीन स्विच वापरून पाहण्यास उत्सुक असाल , परंतु हे करण्यासाठी तुम्हाला Java 14 किंवा उच्च ची आवश्यकता आहे हे लक्षात ठेवा. पूर्वीच्या आवृत्त्यांसह, हे स्विच केवळ तेव्हाच उपलब्ध होईल जेव्हा तुम्ही कमांड लाइनवर "--सक्षम-पूर्वावलोकन" ध्वज निर्दिष्ट केला असेल, कारण आवृत्ती 14 पूर्वी ते तांत्रिक पूर्वावलोकनाचा भाग होते, भाषेचा पूर्ण भाग नसून.

आतासाठी एवढेच! पुन्हा भेटू!