मैं स्ट्रिंग पर स्विच स्टेटमेंट का उपयोग क्यों नहीं कर सकता?


1004

क्या यह कार्यक्षमता बाद के जावा संस्करण में डाल दी जाएगी?

क्या कोई समझा सकता है कि मैं ऐसा क्यों नहीं कर सकता, जैसा कि जावा के switchस्टेटमेंट में तकनीकी तरीके से किया गया है?


195
अनुरोध के बाद यह एसई 7. 16 साल में है। download.oracle.com/javase/tutorial/java/nutsandbolts/...
angryITguy

81
सन उनके मूल्यांकन में ईमानदार था: "Don't hold your breath."lol, bugs.sun.com/bugdatabase/view_bug.do?bug_id=1223179
raffian

3
@ मुझे लगता है कि यह है क्योंकि वह दो बार sigh'ed है। लगभग 10 साल बाद, उन्हें जवाब देने में थोड़ी देर हो गई। वह अपने पोते के लिए लंच बॉक्स पैक कर रही होगी।
WeirdElfB0y

जवाबों:


1003

Stringमामलों के साथ स्विच स्टेटमेंट जावा एसई 7 में लागू किए गए हैं , कम से कम 16 साल बाद वे पहले अनुरोध किए गए थे। देरी का स्पष्ट कारण प्रदान नहीं किया गया था, लेकिन इसकी संभावना प्रदर्शन के साथ थी।

जेडीके 7 में कार्यान्वयन

इस सुविधा को अब javac "डी-शुगरिंग" प्रक्रिया के साथ लागू किया गया है; एक स्वच्छ, उच्च-स्तरीय वाक्यविन्यास का उपयोग घोषणाओं Stringमें स्थिरांक को caseएक पैटर्न के बाद अधिक जटिल कोड में संकलन-समय पर किया जाता है। परिणामी कोड JVM निर्देशों का उपयोग करता है जो हमेशा मौजूद रहे हैं।

एक switchसाथ Stringमामलों संकलन के दौरान दो स्विच में अनुवाद किया है। पहला स्ट्रिंग प्रत्येक स्ट्रिंग को एक अद्वितीय पूर्णांक में देता है - मूल स्विच में इसकी स्थिति। यह पहले लेबल के हैश कोड पर स्विच करके किया जाता है। संबंधित मामला एक ifकथन है जो स्ट्रिंग समानता का परीक्षण करता है; यदि हैश पर टकराव होते हैं, तो परीक्षण एक कैस्केडिंग है if-else-if। दूसरा स्विच दर्पण को मूल स्रोत कोड में रखता है, लेकिन उनके अनुरूप पदों के साथ केस लेबल को प्रतिस्थापित करता है। यह दो-चरणीय प्रक्रिया मूल स्विच के प्रवाह नियंत्रण को संरक्षित करना आसान बनाती है।

जेवीएम में स्विच करता है

अधिक तकनीकी गहराई के लिए switch, आप जेवीएम विनिर्देश का उल्लेख कर सकते हैं, जहां स्विच स्टेटमेंट का संकलन वर्णित है। संक्षेप में, दो अलग-अलग जेवीएम निर्देश हैं जिनका उपयोग स्विच के लिए किया जा सकता है, जो मामलों द्वारा उपयोग किए जाने वाले स्थिरांक की निर्भरता पर निर्भर करता है। दोनों प्रत्येक मामले को कुशलतापूर्वक निष्पादित करने के लिए पूर्णांक स्थिरांक का उपयोग करने पर निर्भर करते हैं।

यदि स्थिरांक घने होते हैं, तो उन्हें एक निर्देशांक (सबसे कम मूल्य को घटाकर) के रूप में उपयोग किया जाता है, निर्देश बिंदुओं की तालिका में - tableswitchनिर्देश।

यदि स्थिरांक विरल हैं, तो सही मामले के लिए एक द्विआधारी खोज- lookupswitchनिर्देश दिया जाता है।

वस्तुओं switchपर डी-शुगरिंग में String, दोनों निर्देशों का उपयोग किए जाने की संभावना है। lookupswitchहैश कोड पर पहले स्विच मामले की मूल स्थिति को खोजने के लिए के लिए उपयुक्त है। परिणामी क्रमिक एक के लिए एक प्राकृतिक फिट है tableswitch

दोनों निर्देशों के लिए प्रत्येक मामले को सौंपे गए पूर्णांक स्थिरांक को संकलन समय पर हल करने की आवश्यकता होती है। रनटाइम के दौरान, आमतौर पर O(1)प्रदर्शन के प्रदर्शन से tableswitchबेहतर प्रतीत होता O(log(n))है lookupswitch, यह निर्धारित करने के लिए कुछ विश्लेषण की आवश्यकता होती है कि क्या अंतरिक्ष-समय के व्यापार को सही ठहराने के लिए तालिका पर्याप्त घनी है। बिल वीनर्स ने एक महान लेख लिखा जो इसे और अधिक विस्तार से कवर करता है, साथ ही अन्य जावा प्रवाह नियंत्रण निर्देशों पर एक अंडर-हुड नज़र के साथ।

जेडीके 7 से पहले

जेडीके 7 से पहले, enumएक- Stringआधारित स्विच का अनुमान लगा सकता है । यह संकलक द्वारा उत्पन्न हर प्रकार पर स्थिरvalueOf विधि का उपयोग करता हैenum । उदाहरण के लिए:

Pill p = Pill.valueOf(str);
switch(p) {
  case RED:  pop();  break;
  case BLUE: push(); break;
}

26
यह केवल स्ट्रिंग आधारित स्विच के लिए हैश के बजाय if-Else-if का उपयोग करने के लिए तेज़ हो सकता है। मुझे लगता है कि केवल कुछ वस्तुओं को संग्रहीत करने पर शब्दकोश काफी महंगे हैं।
जोनाथन एलन

84
अगर एक-इतर-इशिफ-और-इस्तिफ-और तेज हो सकता है, लेकिन मैं 100 में से 99 बार क्लीनर कोड ले जाऊंगा। स्ट्रिंग्स, अपरिवर्तनीय होने के नाते, उनके हैश कोड को कैश करें, इसलिए हैश को "कंप्यूटिंग" करना तेज है। यह निर्धारित करने के लिए कि किसी को क्या फ़ायदा होता है, प्रोफाइल कोड बनाना होगा।
इरिकसन

21
स्विच (स्ट्रिंग) जोड़ने के खिलाफ दिया गया कारण यह है कि यह स्विच () स्टेटमेंट से प्रदर्शन की गारंटी की अपेक्षा को पूरा नहीं करेगा। वे डेवलपर्स को "भ्रमित" नहीं करना चाहते थे। सच कहूँ तो मुझे नहीं लगता कि उन्हें स्विच () के प्रदर्शन की गारंटी देनी चाहिए।
गिली

2
यदि आप सिर्फ मेरे Pillआधार पर कुछ कार्रवाई करने के लिए उपयोग कर रहे strहैं, तो यदि कोई और बेहतर होगा, तो यह तर्क योग्य होगा क्योंकि यह आपको strसीमा के बाहर मानों को संभालने की अनुमति देता है , BLUE से अपवाद को पकड़ने valueOfया मैन्युअल रूप से एक मैच के लिए जाँच करने की आवश्यकता के बिना प्रत्येक गणना प्रकार जो अनावश्यक ओवरहेड जोड़ता है। मेरे अनुभव में यह केवल समझ में आने का उपयोग valueOfकरने के लिए बना है कि स्ट्रिंग मूल्य का एक प्रकार का प्रतिनिधित्व बाद में आवश्यक था।
माइल्सहम्पसन

मुझे आश्चर्य है कि यदि कंपाइलर्स यह जांचने का कोई प्रयास करते हैं कि क्या संख्याओं (x, y) की कोई जोड़ी है, जिसके लिए मूल्यों का सेट (hash >> x) & ((1<<y)-1)हर स्ट्रिंग के लिए अलग-अलग मान उत्पन्न करेगा hashCode, जो अलग है, और (1<<y)स्ट्रिंग्स की संख्या से दोगुना (या कम है) कम से कम इससे ज्यादा नहीं)।
सुपरकाट

125

यदि आपके पास अपने कोड में एक जगह है जहां आप स्ट्रिंग पर स्विच कर सकते हैं, तो स्ट्रिंग को संभव मानों की गणना करने के लिए फिर से भरना बेहतर हो सकता है, जिसे आप स्विच कर सकते हैं। बेशक, आप स्ट्रिंग्स के उन संभावित मूल्यों को सीमित कर सकते हैं जो आपके पास एन्यूमरेशन में हो सकते हैं, जो वांछित हो सकते हैं या नहीं।

निश्चित रूप से आपकी गणना में 'अन्य' और एक डिक्रिंग (स्ट्रिंग) विधि के लिए एक प्रविष्टि हो सकती है, तो आप कर सकते हैं

ValueEnum enumval = ValueEnum.fromString(myString);
switch (enumval) {
   case MILK: lap(); break;
   case WATER: sip(); break;
   case BEER: quaff(); break;
   case OTHER: 
   default: dance(); break;
}

4
यह तकनीक आपको ऐसे मामले असंवेदनशीलता, उपनाम आदि के मुद्दों पर निर्णय लेने देती है, इसके बजाय "एक आकार सभी फिट बैठता है" समाधान के साथ आने के लिए भाषा डिजाइनर पर निर्भर करता है।
डैरन

2
JeeBee से सहमत हों, अगर आप स्ट्रिंग्स पर स्विच कर रहे हैं तो शायद एक एनम की जरूरत है। स्ट्रिंग आमतौर पर एक इंटरफ़ेस (उपयोगकर्ता या अन्यथा) पर जाने वाली किसी चीज़ का प्रतिनिधित्व करती है जो भविष्य में बदल सकती है या नहीं भी हो सकती है इसलिए इसे बेहतर तरीके से बदल दें
hhafez

18
इस विधि के अच्छे लिखने के लिए xefer.com/2006/12/switchonstring देखें ।
डेविड श्मिट

@DavidSchmitt लेखन में एक प्रमुख दोष है। यह उन सभी अपवादों को पकड़ता है जो वास्तव में मिथोड द्वारा फेंके गए हैं।
एम। मिम्पेन

91

JeeBee की पोस्ट के आधार पर निम्नलिखित एक पूर्ण उदाहरण है, java enum का उपयोग कस्टम विधि का उपयोग करने के बजाय।

ध्यान दें कि जावा एसई 7 और बाद में आप स्विच स्टेटमेंट की अभिव्यक्ति में स्ट्रिंग ऑब्जेक्ट का उपयोग कर सकते हैं।

public class Main {

    /**
    * @param args the command line arguments
    */
    public static void main(String[] args) {

      String current = args[0];
      Days currentDay = Days.valueOf(current.toUpperCase());

      switch (currentDay) {
          case MONDAY:
          case TUESDAY:
          case WEDNESDAY:
              System.out.println("boring");
              break;
          case THURSDAY:
              System.out.println("getting better");
          case FRIDAY:
          case SATURDAY:
          case SUNDAY:
              System.out.println("much better");
              break;

      }
  }

  public enum Days {

    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
  }
}

26

पूर्णांकों पर आधारित स्विच को बहुत प्रभावी कोड के लिए अनुकूलित किया जा सकता है। अन्य डेटा प्रकार के आधार पर स्विच केवल (यदि) कथनों की एक श्रृंखला के लिए संकलित किए जा सकते हैं।

उस कारण से C & C ++ केवल पूर्णांक प्रकारों पर स्विच की अनुमति देता है, क्योंकि यह अन्य प्रकारों के साथ व्यर्थ था।

सी # के डिजाइनरों ने फैसला किया कि शैली महत्वपूर्ण थी, भले ही कोई फायदा न हो।

जावा के डिजाइनरों ने स्पष्ट रूप से सी के डिजाइनरों की तरह सोचा था।


26
किसी हैशटैब ऑब्जेक्ट पर आधारित स्विच को हैश टेबल का उपयोग करके बहुत कुशलता से लागू किया जा सकता है - .NET देखें। तो आपका कारण पूरी तरह से सही नहीं है।
कोनराड रुडोल्फ

हाँ, और यह वह चीज़ है जो मुझे समझ नहीं आ रही है। क्या वे लंबे समय से महंगी हो गई हैशिंग ऑब्जेक्ट्स से डरते हैं?
एलेक्स बेयडस्ले

3
@ नंदालियन: वास्तव में, संकलक की ओर से थोड़े प्रयास के साथ, यह बिल्कुल महंगा नहीं है क्योंकि जब स्ट्रिंग्स के सेट को जाना जाता है, तो एक सही हैश उत्पन्न करना बहुत आसान है (यह .NET द्वारा नहीं किया जाता है, हालांकि; शायद प्रयास के लायक नहीं है, या तो)।
कोनराड रुडोल्फ

3
@ मालाडियल और @ कोनराड रूडोल्फ - जबकि हैशिंग एक स्ट्रिंग (यह अपरिवर्तनीय प्रकृति के कारण) इस समस्या के समाधान की तरह लगता है कि आपको यह याद रखना होगा कि सभी गैर-अंतिम ऑब्जेक्ट्स में उनके हैशिंग फ़ंक्शन ओवरराइड हो सकते हैं। यह एक स्विच में स्थिरता सुनिश्चित करने के लिए संकलन समय पर मुश्किल बनाता है।
मार्टिनेटाइम

2
आप स्ट्रिंग से मेल खाने के लिए DFA का निर्माण भी कर सकते हैं (जैसे नियमित अभिव्यक्ति इंजन करते हैं)। संभवतः हैशिंग से भी अधिक कुशल।
नैट सीके

19

String1.7 के बाद से प्रत्यक्ष उपयोग का एक उदाहरण भी दिखाया जा सकता है:

public static void main(String[] args) {

    switch (args[0]) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
            System.out.println("boring");
            break;
        case "Thursday":
            System.out.println("getting better");
        case "Friday":
        case "Saturday":
        case "Sunday":
            System.out.println("much better");
            break;
    }

}

18

जेम्स क्यूरान सफलतापूर्वक कहते हैं: "पूर्णांक पर आधारित स्विच को बहुत ही प्रभावी कोड के लिए अनुकूलित किया जा सकता है। अन्य डेटा प्रकार के आधार पर स्विच केवल (अगर) कथनों की एक श्रृंखला के लिए संकलित किए जा सकते हैं। उस कारण से C & C ++ केवल पूर्णांक प्रकारों के स्विच की अनुमति देता है। चूंकि यह अन्य प्रकारों के साथ व्यर्थ था। "

मेरी राय, और यह केवल इतना ही है, जैसे ही आप गैर-प्राइमेटिक्स पर स्विच करना शुरू करते हैं, आपको "बराबर" बनाम "==" के बारे में सोचना शुरू करना होगा। सबसे पहले दो तारों की तुलना करना काफी लंबी प्रक्रिया हो सकती है, जो ऊपर बताई गई प्रदर्शन समस्याओं को जोड़ सकती है। दूसरी बात यह है कि अगर स्ट्रिंग्स पर स्विचिंग है तो स्ट्रैस ऑनिंग केस पर स्विच करने की मांग होगी, लोकेशन्स पर ध्यान नहीं देना / इग्नोर करना स्ट्रिंग्स पर स्विच करना, रेगेक्स पर आधारित स्ट्रिंग्स पर स्विच करना .... मैं एक ऐसे फैसले को मंजूरी दूंगा, जिसमें काफी समय बचा हो। प्रोग्रामर के लिए समय की एक छोटी राशि की कीमत पर भाषा डेवलपर्स।


तकनीकी रूप से, रेगेक्स पहले से ही "स्विच" करते हैं, क्योंकि वे मूल रूप से सिर्फ राज्य मशीन हैं; उनके पास केवल दो "मामले" हैं, matchedऔर not matched। (हालांकि [नामित] समूहों / आदि जैसी चीजों को ध्यान में नहीं रखा गया है।)
जेएबी

1
docs.oracle.com/javase/7/docs/technotes/guides/language/… स्टेट्स: जावा कंपाइलर आमतौर पर स्विच स्टेटमेंट्स से अधिक कुशल
Wim Deblauwe

12

उपरोक्त अच्छे तर्कों के अलावा, मैं आज के बहुत से लोगों switchको जावा के प्रक्रियात्मक अतीत के अप्रचलित शेष के रूप में देखता हूं ।

मैं इस राय को पूरी तरह से साझा नहीं करता हूं, मुझे लगता है कि switchकुछ मामलों में इसकी उपयोगिता हो सकती है, कम से कम इसकी गति के कारण, और वैसे भी यह अंकन के कुछ श्रृंखलाओं से बेहतर है जो else ifमैंने कुछ कोड में देखा था ...

लेकिन वास्तव में, यह उस मामले को देखने के लायक है जहां आपको स्विच की आवश्यकता होती है, और देखें कि क्या इसे कुछ और ओओ द्वारा प्रतिस्थापित नहीं किया जा सकता है। उदाहरण के लिए जावा 1.5+, शायद हैशटेबल या कुछ अन्य संग्रह (कभी-कभी मुझे खेद है कि हमारे पास अनाम वर्ग) के रूप में Lua में - जिसके पास स्विच - या जावास्क्रिप्ट नहीं है) या यहां तक ​​कि बहुरूपता भी है


"कुछ समय बाद मुझे खेद है कि हमारे पास प्रथम श्रेणी के नागरिक के रूप में (अनाम) कार्य नहीं हैं" यह अब सच नहीं है।
user8397947

@dorukayhan हां, बिल्कुल। लेकिन क्या आप पिछले दस वर्षों के सभी उत्तरों पर एक टिप्पणी जोड़ना चाहते हैं ताकि दुनिया को बता सकें कि अगर हम जावा के नए संस्करणों के लिए अद्यतन करते हैं तो हम उनके पास हो सकते हैं? :-D
फीलो

8

यदि आप JDK7 या उच्चतर का उपयोग नहीं कर रहे हैं, तो आप hashCode()इसे अनुकरण करने के लिए उपयोग कर सकते हैं । क्योंकि String.hashCode()आमतौर पर अलग-अलग स्ट्रिंग्स के लिए अलग-अलग मान लौटते हैं और हमेशा समान स्ट्रिंग्स के लिए समान मान लौटाते हैं, यह काफी विश्वसनीय है (विभिन्न स्ट्रिंग्स एक ही हैश कोड का उत्पादन कर सकते हैं जैसा कि @Lii एक टिप्पणी में उल्लिखित है, जैसे "FB"और "Ea") प्रलेखन देखें ।

तो, कोड इस तरह दिखेगा:

String s = "<Your String>";

switch(s.hashCode()) {
case "Hello".hashCode(): break;
case "Goodbye".hashCode(): break;
}

इस तरह, आप तकनीकी रूप से एक पर स्विच कर रहे हैं int

वैकल्पिक रूप से, आप निम्नलिखित कोड का उपयोग कर सकते हैं:

public final class Switch<T> {
    private final HashMap<T, Runnable> cases = new HashMap<T, Runnable>(0);

    public void addCase(T object, Runnable action) {
        this.cases.put(object, action);
    }

    public void SWITCH(T object) {
        for (T t : this.cases.keySet()) {
            if (object.equals(t)) { // This means that the class works with any object!
                this.cases.get(t).run();
                break;
            }
        }
    }
}

5
दो अलग-अलग स्ट्रिंग में एक ही हैशकोड हो सकता है, इसलिए यदि आप हैशकोड पर स्विच करते हैं तो गलत केस-ब्रांच ली जा सकती है।
Lii

@ एलआईई ने इसे इंगित करने के लिए धन्यवाद दिया! यह संभावना नहीं है, हालांकि, लेकिन मुझे यह काम करने पर भरोसा नहीं होगा। "एफबी" और "ईए" में एक ही हैशकोड है, इसलिए टकराव का पता लगाना असंभव नहीं है। दूसरा कोड शायद अधिक विश्वसनीय है।
हाइपरनेत्रिनो

मुझे यह संकलन आश्चर्यचकित करता है, जैसा कि caseबयानों में था, मुझे लगा, हमेशा स्थिर मूल्य होते हैं, और String.hashCode()ऐसा नहीं है (भले ही अभ्यास गणना में जेवीएम के बीच कभी भी बदलाव नहीं हुआ हो)।
स्टैक्मैन मैन 26'18

@StaxMan हम्म दिलचस्प, मैं उस पर ध्यान देने के लिए कभी नहीं रुका। लेकिन हाँ, caseबयान मूल्यों को संकलन-समय पर निर्धारित करने की आवश्यकता नहीं है इसलिए यह बारीक काम करता है।
हाइपरनेत्रिनो

4

वर्षों से हम इसके लिए एक (एन ओपन सोर्स) प्रीप्रोसेसर का उपयोग कर रहे हैं।

//#switch(target)
case "foo": code;
//#end

प्रीप्रोसेस की गई फ़ाइलों को Foo.jpp नाम दिया गया है और एक एंटी स्क्रिप्ट के साथ Foo.java में संसाधित किया गया है।

लाभ यह जावा में संसाधित होता है जो 1.0 पर चलता है (हालांकि आमतौर पर हम केवल 1.4 पर वापस समर्थित होते हैं)। इसके अलावा यह करना बहुत आसान था (बहुत सारे स्ट्रिंग स्विच) इसे एनम या अन्य वर्कअराउंड के साथ फ्यूड करने की तुलना में - कोड को पढ़ना, बनाए रखना और समझना बहुत आसान था। IIRC (इस बिंदु पर आंकड़े या तकनीकी तर्क प्रदान नहीं कर सकता है) यह प्राकृतिक जावा समकक्षों की तुलना में भी तेज था।

नुकसान यह है कि आप जावा का संपादन नहीं कर रहे हैं, इसलिए यह थोड़ा अधिक वर्कफ़्लो है (संपादित करें, प्रक्रिया, संकलन / परीक्षण) प्लस एक आईडीई जावा से वापस लिंक करेगा जो थोड़ा जटिल है (स्विच की एक श्रृंखला बन जाती है / अन्यथा तर्क चरण) और स्विच केस ऑर्डर बरकरार नहीं है।

मैं इसे 1.7+ के लिए अनुशंसित नहीं करूंगा, लेकिन यदि आप जावा को लक्षित करना चाहते हैं तो यह उपयोगी है जो पहले के जेवीएम को लक्षित करता है (क्योंकि जो जनता के पास शायद ही नवीनतम स्थापित है)।

आप इसे एसवीएन से प्राप्त कर सकते हैं या ऑनलाइन कोड ब्राउज़ कर सकते हैं । आपको इसे बनाने के लिए EBuild की आवश्यकता होगी ।


6
आपको स्ट्रिंग स्विच के साथ कोड चलाने के लिए 1.7 JVM की आवश्यकता नहीं है। 1.7 कंपाइलर स्ट्रिंग स्विच को ऐसी चीज में बदलता है जो पहले से मौजूद बाइट कोड का उपयोग करता है।
दाऊद इब्न करीम

4

अन्य जवाबों ने कहा है कि यह जावा 7 में जोड़ा गया था और पहले के संस्करणों के लिए वर्कअराउंड दिया गया था। यह उत्तर "क्यों" का उत्तर देने का प्रयास करता है

जावा C ++ की अति-जटिलताओं के लिए एक प्रतिक्रिया थी। यह एक सरल स्वच्छ भाषा होने के लिए डिज़ाइन किया गया था।

स्ट्रिंग को भाषा में विशेष केस हैंडलिंग का थोड़ा सा मौका मिला, लेकिन यह मुझे स्पष्ट लगता है कि डिजाइनर विशेष आवरण और सिंथैटिक चीनी की मात्रा को न्यूनतम रखने की कोशिश कर रहे थे।

स्ट्रिंग्स पर स्विच करना हुड के नीचे काफी जटिल है क्योंकि स्ट्रिंग्स सरल आदिम प्रकार नहीं हैं। यह उस समय एक सामान्य विशेषता नहीं थी जब जावा डिजाइन किया गया था और वास्तव में न्यूनतम डिजाइन के साथ अच्छी तरह से फिट नहीं था। विशेष रूप से जैसा कि उन्होंने स्ट्रिंग्स के लिए विशेष मामले == का फैसला नहीं किया था, यह मामला (=) के लिए थोड़ा अजीब होगा जहां = = काम नहीं करता है।

1.0 और 1.4 के बीच भाषा अपने आप में बहुत समान थी। जावा के अधिकांश संवर्द्धन पुस्तकालय की ओर थे।

यह सब जावा 5 के साथ बदल गया, भाषा को काफी हद तक बढ़ाया गया था। इसके बाद के संस्करण 7 और 8 में विस्तार किया गया। मुझे उम्मीद है कि सी # के उदय से रवैये में बदलाव आया है।


स्विच (स्ट्रिंग) के बारे में कथा इतिहास, समयरेखा, संदर्भ cpp / cs के साथ फिट बैठती है।
एस्प्रेसो

इस सुविधा को लागू नहीं करने के लिए यह एक बड़ी गलती थी, बाकी सब कुछ एक सस्ता बहाना है जावा ने कई उपयोगकर्ताओं को प्रगति की कमी और डिजाइनरों की जिद के कारण भाषा को विकसित नहीं करने के लिए खो दिया है। सौभाग्य से उन्होंने JDK7 के बाद दिशा और दृष्टिकोण को पूरी तरह से बदल दिया
फायर

0

JEP 354: JDK-13 में स्विच एक्सप्रेशंस (पूर्वावलोकन) और JEP 361: JDK-14 में स्विच एक्सप्रेशंस (स्टैंडर्ड) स्विच स्टेटमेंट का विस्तार करेगा,इसलिए इसे एक अभिव्यक्ति के रूप में इस्तेमाल किया जा सकता है।

अब आप कर सकते हैं:

  • स्विच अभिव्यक्ति से सीधे चर असाइन करें ,
  • स्विच लेबल के नए रूप का उपयोग करें ( case L ->):

    "केस एल ->" स्विच लेबल के दाईं ओर कोड एक अभिव्यक्ति, एक ब्लॉक, या (सुविधा के लिए) एक फेंक स्टेटमेंट होना प्रतिबंधित है।

  • प्रति मामले में कई स्थिरांक का उपयोग करें, जो अल्पविराम द्वारा अलग किए जाते हैं,
  • और भी अधिक मूल्य विराम नहीं हैं :

    एक स्विच अभिव्यक्ति से एक मूल्य प्राप्त करने के लिए, breakमूल्य कथन के साथ एक yieldबयान के पक्ष में गिरा दिया जाता है ।

तो उत्तर ( 1 , 2 ) से डेमो इस तरह लग सकता है:

  public static void main(String[] args) {
    switch (args[0]) {
      case "Monday", "Tuesday", "Wednesday" ->  System.out.println("boring");
      case "Thursday" -> System.out.println("getting better");
      case "Friday", "Saturday", "Sunday" -> System.out.println("much better");
    }

-2

बहुत सुंदर नहीं है, लेकिन यहाँ जावा 6 और bellow के लिए एक और तरीका है:

String runFct = 
        queryType.equals("eq") ? "method1":
        queryType.equals("L_L")? "method2":
        queryType.equals("L_R")? "method3":
        queryType.equals("L_LR")? "method4":
            "method5";
Method m = this.getClass().getMethod(runFct);
m.invoke(this);

-3

यह ग्रूवी में एक हवा है; मैं ग्रूवी जार को एम्बेड करता हूं और groovyइन सभी चीजों को करने के लिए एक उपयोगिता वर्ग बनाता हूं और जो मुझे जावा में करने के लिए बहुत अधिक लगता है (क्योंकि मैं उद्यम में जावा 6 का उपयोग कर रहा हूं।)

it.'p'.each{
switch (it.@name.text()){
   case "choclate":
     myholder.myval=(it.text());
     break;
     }}...

9
@SSpoke क्योंकि यह एक जावा सवाल है और एक ग्रूवी जवाब ऑफ टॉपिक और एक बेकार प्लग है।
मार्टिन

12
यहां तक ​​कि रूढ़िवादी बड़े SW घरों में Groovy का उपयोग जावा के साथ किया जाता है। JVM समाधान के लिए सबसे अधिक प्रासंगिक प्रोग्रामिंग प्रतिमान को मिलाने और उपयोग करने के लिए, एक भाषा से अधिक एक भाषा अज्ञेय वातावरण देता है। तो शायद अब मुझे
क्लोजर

1
इसके अलावा, वाक्य रचना कैसे काम करती है? मुझे लगता है कि Groovy एक अलग प्रोग्रामिंग भाषा है ...? माफ़ करना। मैं Groovy के बारे में कुछ नहीं जानता।
हाइपरनेत्रिनो

-4

जब आप intellij का उपयोग करते हैं, तो भी देखें:

फ़ाइल -> परियोजना संरचना -> परियोजना

फ़ाइल -> परियोजना संरचना -> मॉड्यूल

जब आपके पास कई मॉड्यूल होते हैं, तो सुनिश्चित करें कि आपने मॉड्यूल टैब में सही भाषा स्तर निर्धारित किया है।


1
निश्चित नहीं है कि आपका उत्तर प्रश्न के लिए कैसे प्रासंगिक है। उन्होंने पूछा कि निम्नलिखित की तरह एक स्ट्रिंग स्विच स्टेटमेंट क्यों उपलब्ध नहीं है: स्ट्रिंग मिस्ट्रींग = "कुछ"; स्विच (रहस्य) {मामला "कुछ" sysout ("यहाँ मिला"); । । }
दीपक अग्रवाल

-8
public class StringSwitchCase { 

    public static void main(String args[]) {

        visitIsland("Santorini"); 
        visitIsland("Crete"); 
        visitIsland("Paros"); 

    } 

    public static void visitIsland(String island) {
         switch(island) {
          case "Corfu": 
               System.out.println("User wants to visit Corfu");
               break; 
          case "Crete": 
               System.out.println("User wants to visit Crete");
               break; 
          case "Santorini": 
               System.out.println("User wants to visit Santorini");
               break; 
          case "Mykonos": 
               System.out.println("User wants to visit Mykonos");
               break; 
         default: 
               System.out.println("Unknown Island");
               break; 
         } 
    } 

} 

8
ओपी यह नहीं पूछ रहा है कि स्ट्रिंग पर कैसे स्विच किया जाए। वह JDK7 से पहले वाक्यविन्यास पर प्रतिबंध के कारण पूछ रहा है कि वह क्यों / वह नहीं कर पा रहा है।
हाइपरनेत्रिनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.