जावा में अगर / और बनाम स्विच स्टेटमेंट के सापेक्ष प्रदर्शन अंतर क्या है?


122

मेरे वेब एप्लिकेशन के प्रदर्शन के बारे में चिंता करते हुए, मैं सोच रहा हूं कि प्रदर्शन के संबंध में "if / else" या स्विच स्टेटमेंट में से कौन बेहतर है?


6
क्या आपके पास यह सोचने का कोई कारण है कि एक ही बाईटेकोड दो निर्माणों के लिए उत्पन्न नहीं होता है?
पास्कल क्यूक

2
@ पास्कल: ifआदि की सूची के बजाय टेबल लुक-अप का उपयोग करके अनुकूलन किया जा सकता है
Jldupont

18
"समयपूर्व अनुकूलन सभी बुराई की जड़ है" - डोनाल्ड नुथ
लापता

104
हालांकि यह निश्चित रूप से समय से पहले का अनुकूलन है, "संदर्भ से बुरी तरह से बाहर निकाले गए उद्धरण का माइंडलेस पालन, यही कारण है कि हमें आज एक उचित रूप से उत्तरदायी जीयूआई प्रदर्शित करने के लिए एक उच्च अंत मल्टी-कोर कंप्यूटर की आवश्यकता है" - मुझे।
लॉरेंस डॉल

2
नुथ का सटीक दिमाग है। कृपया क्वालीफायर "समय से पहले" पर ध्यान दें। अनुकूलन एक पूरी तरह से वैध चिंता है। उस ने कहा, एक सर्वर IO बाउंड है और नेटवर्क और डिस्क I / O की अड़चनें आपके सर्वर में चल रही किसी भी चीज की तुलना में अधिक महत्वपूर्ण हैं।
अल्फ़ाज़ो

जवाबों:


108

यह माइक्रो ऑप्टिमाइज़ेशन और प्रीमेच्योर ऑप्टिमाइज़ेशन है, जो बुराई हैं। बल्कि प्रश्न में कोड की पठनीयता और स्थिरता के बारे में चिंता करना। यदि दो से अधिक if/elseब्लॉक एक साथ चिपके हुए हैं या इसका आकार अप्रत्याशित है, तो आप एक switchबयान पर अत्यधिक विचार कर सकते हैं ।

वैकल्पिक रूप से, आप पॉलीमॉर्फिज्म को भी हथिया सकते हैं । पहले कुछ इंटरफ़ेस बनाएँ:

public interface Action { 
    void execute(String input);
}

और कुछ में सभी कार्यान्वयन को पकड़ें Map। आप इसे सांख्यिकीय या गतिशील रूप से कर सकते हैं:

Map<String, Action> actions = new HashMap<String, Action>();

अंत में if/elseया switchइस तरह से कुछ की जगह (तुच्छ चेक की तरह तुच्छ जाँच को छोड़कर)

actions.get(name).execute(input);

यह माइक्रोस्लोवर की तुलना में या हो सकता है , लेकिन कोड कम से कम बेहतर रखरखाव योग्य है।if/elseswitch

जैसा कि आप webapplications के बारे में बात कर रहे हैं, आप HttpServletRequest#getPathInfo()एक्शन कुंजी के रूप में उपयोग कर सकते हैं (अंततः एक कार्रवाई मिलने तक पाथिनफो के अंतिम भाग को लूप में विभाजित करने के लिए कुछ और कोड लिखें)। आप यहाँ ऐसे ही उत्तर पा सकते हैं:

यदि आप सामान्य रूप से जावा ईई वेब प्रदर्शन के बारे में चिंता कर रहे हैं, तो आपको यह लेख उपयोगी भी लग सकता है। ऐसे अन्य क्षेत्र हैं जो कच्चे जावा कोड को अनुकूलित करके केवल (माइक्रो) की तुलना में बहुत अधिक प्रदर्शन लाभ देते हैं।


1
या इसके बजाय बहुरूपता पर विचार करें
जे.के.

यदि वास्तव में "अनप्रेडिक्टेबल" राशि के इतर / ब्लॉक के मामले में अधिक अनुशंसित है।
बालूसी

73
मैं "बुराई" के रूप में सभी शुरुआती अनुकूलन को खारिज करने के लिए इतनी जल्दी नहीं हूं। बहुत अधिक आक्रामक होना मूर्खतापूर्ण है, लेकिन जब तुलनीय पठनीयता के निर्माण का सामना करना पड़ता है तो बेहतर प्रदर्शन करने के लिए किसी एक को चुनना एक उचित निर्णय होता है।
ब्रायन नोब्लुक

8
किसी टेबलविट्स इंस्ट्रक्शन की तुलना में हाशप लुकअप वर्जन आसानी से 10 गुना धीमा हो सकता है। मैं इसे "microslower" नहीं कहूंगा!
15:

7
मुझे वास्तव में स्विच स्टेटमेंट वाले सामान्य मामले में जावा के आंतरिक कामकाज को जानने में दिलचस्पी है - मुझे इस बात में कोई दिलचस्पी नहीं है कि किसी को लगता है कि यह प्रारंभिक अनुकूलन को प्राथमिकता देने से संबंधित है या नहीं। यह कहा जा रहा है, मुझे इस बात का बिलकुल भी अंदाजा नहीं है कि इस उत्तर को इतना क्यों उखाड़ा गया है और यह स्वीकृत उत्तर क्यों है ... यह प्रारंभिक प्रश्न का उत्तर देने के लिए कुछ भी नहीं करता है।
searchengine27

125

मैं पूरी तरह से इस राय से सहमत हूं कि समय से पहले अनुकूलन से बचने के लिए कुछ है।

लेकिन यह सच है कि जावा वीएम के पास विशेष बायोटेक है जो स्विच () के लिए इस्तेमाल किया जा सकता है।

देखें WM युक्ति ( lookupswitch और tableswitch )

तो कुछ प्रदर्शन लाभ हो सकते हैं, यदि कोड प्रदर्शन सीपीयू ग्राफ का हिस्सा है।


60
मुझे आश्चर्य है कि इस टिप्पणी को उच्च दर्जा क्यों नहीं दिया गया है: यह उन सभी में सबसे अधिक सूचनात्मक है। मेरा मतलब है: हम सभी पहले से ही समय से पहले इष्टतमकरण के खराब होने के बारे में जानते हैं और इस तरह, 1000 वें समय के लिए यह समझाने की आवश्यकता नहीं है।
लोकगीत वैन हेस्डेन

5
+1 के रूप में stackoverflow.com/a/15621602/89818 यह लगता है कि प्रदर्शन लाभ वास्तव में हैं, और यदि आप 18+ मामलों का उपयोग करते हैं तो आपको एक फायदा देखना चाहिए।
कांव-कांव

52

यह बेहद संभावना नहीं है कि एक / अन्यथा या एक स्विच आपके प्रदर्शन संकट का स्रोत होने जा रहा है। यदि आपको प्रदर्शन समस्याएं हो रही हैं, तो आपको यह निर्धारित करने के लिए पहले एक प्रदर्शन रूपरेखा विश्लेषण करना चाहिए कि धीमे धब्बे कहां हैं। सभी बुराईयो की जड़ समयपूर्व इष्टतमीकरण है!

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

switch (<condition>) {
   case c_0: ...
   case c_1: ...
   ...
   case c_n: ...
   default: ...
}

जहां c_0, c_1..., और c_Nअभिन्न संख्याएं हैं जो स्विच स्टेटमेंट के लक्ष्य हैं, और <condition>पूर्णांक अभिव्यक्ति के लिए हल होना चाहिए।

  • यदि यह सेट "घना" है - अर्थात, (अधिकतम ( i ) + 1 - मिनट (c i )) / n> α, जहां 0 <k <α <1, जहां kकुछ अनुभवजन्य मूल्य से बड़ा है, a जंप टेबल उत्पन्न की जा सकती है, जो अत्यधिक कुशल है।

  • यदि यह सेट बहुत सघन नहीं है, लेकिन n> = a, एक बाइनरी सर्च ट्री ओ (2 * लॉग (एन)) में लक्ष्य पा सकता है जो अभी भी कुशल है।

अन्य सभी मामलों के लिए, एक स्विच स्टेटमेंट ठीक वैसा ही कुशल है, जैसा कि / और स्टेटमेंट्स की बराबर श्रृंखला है। Α और β के सटीक मान कई कारकों पर निर्भर करते हैं और संकलक के कोड-अनुकूलन मॉड्यूल द्वारा निर्धारित किए जाते हैं।

अंत में, निश्चित रूप से, यदि डोमेन <condition>पूर्णांक नहीं है, तो एक स्विच स्टेटमेंट पूरी तरह से बेकार है।


+1। एक अच्छा मौका है कि नेटवर्क I / O पर बिताया गया समय इस विशेष मुद्दे को आसानी से ग्रहण कर रहा है।
एडम पेन्न्टर

3
यह ध्यान दिया जाना चाहिए कि स्विच केवल ints से अधिक के साथ काम करते हैं। जावा ट्यूटोरियल्स से: "एक स्विच बाइट, शॉर्ट, चार और इंट प्रिमिटिव डेटा प्रकारों के साथ काम करता है। यह एन्यूमरेटेड टाइप्स (एनम टाइप्स में चर्चा की गई), स्ट्रिंग क्लास और कुछ विशेष क्लासेस के साथ भी काम करता है, जो प्राइमरी टाइप्स को लपेटते हैं। : चरित्र, बाइट, लघु, और पूर्णांक (संख्या और स्ट्रिंग्स में चर्चा की गई)। " स्ट्रिंग के लिए समर्थन अधिक हालिया जोड़ है; जावा में जोड़ा गया। docs.oracle.com/javase/tutorial/java/nutsandbolts/switch.html
atraudes

1
@jhonFeminella यदि आप / तो और में स्ट्रिंग की तुलना में Swtich में Java7 स्ट्रिंग के लिए BIG O धारणा प्रभाव की तुलना कर सकते हैं?
काणागावेलु सुगुमार

अधिक सटीक रूप से, javac 8 अंतरिक्ष जटिलता पर 3 से समय की जटिलता का भार देता है: stackoverflow.com/a/31032054/895245
Ciro Santilli 郝海东 ac ac ac

11

स्विच का उपयोग करें!

मुझे अगर-और-ब्लॉक बनाए रखने से नफरत है! एक परीक्षण करें:

public class SpeedTestSwitch
{
    private static void do1(int loop)
    {
        int temp = 0;
        for (; loop > 0; --loop)
        {
            int r = (int) (Math.random() * 10);
            switch (r)
            {
                case 0:
                    temp = 9;
                    break;
                case 1:
                    temp = 8;
                    break;
                case 2:
                    temp = 7;
                    break;
                case 3:
                    temp = 6;
                    break;
                case 4:
                    temp = 5;
                    break;
                case 5:
                    temp = 4;
                    break;
                case 6:
                    temp = 3;
                    break;
                case 7:
                    temp = 2;
                    break;
                case 8:
                    temp = 1;
                    break;
                case 9:
                    temp = 0;
                    break;
            }
        }
        System.out.println("ignore: " + temp);
    }

    private static void do2(int loop)
    {
        int temp = 0;
        for (; loop > 0; --loop)
        {
            int r = (int) (Math.random() * 10);
            if (r == 0)
                temp = 9;
            else
                if (r == 1)
                    temp = 8;
                else
                    if (r == 2)
                        temp = 7;
                    else
                        if (r == 3)
                            temp = 6;
                        else
                            if (r == 4)
                                temp = 5;
                            else
                                if (r == 5)
                                    temp = 4;
                                else
                                    if (r == 6)
                                        temp = 3;
                                    else
                                        if (r == 7)
                                            temp = 2;
                                        else
                                            if (r == 8)
                                                temp = 1;
                                            else
                                                if (r == 9)
                                                    temp = 0;
        }
        System.out.println("ignore: " + temp);
    }

    public static void main(String[] args)
    {
        long time;
        int loop = 1 * 100 * 1000 * 1000;
        System.out.println("warming up...");
        do1(loop / 100);
        do2(loop / 100);

        System.out.println("start");

        // run 1
        System.out.println("switch:");
        time = System.currentTimeMillis();
        do1(loop);
        System.out.println(" -> time needed: " + (System.currentTimeMillis() - time));

        // run 2
        System.out.println("if/else:");
        time = System.currentTimeMillis();
        do2(loop);
        System.out.println(" -> time needed: " + (System.currentTimeMillis() - time));
    }
}

बेंचमार्किंग के लिए मेरा सी # मानक कोड


क्या आप (कुछ समय) कृपया इस पर थोड़ा विस्तार कर सकते हैं कि आपने यह कैसे किया?
डेराइक

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

@DerMike मुझे याद नहीं है कि मुझे पुराने परिणाम कैसे मिले। मैं आज बहुत अलग हो गया। लेकिन इसे स्वयं आज़माएं और मुझे बताएं कि यह कैसे बदल जाता है।
बिटरबेलू

1
जब मैं इसे अपने लैपटॉप पर चलाता हूं; स्विच समय की जरूरत: 3585, अगर / और समय की जरूरत: 3458 तो अगर / और बेहतर है :) या बुरा नहीं है
आधा

1
परीक्षण में प्रमुख लागत यादृच्छिक संख्या पीढ़ी है। मैंने लूप से पहले यादृच्छिक संख्या उत्पन्न करने के लिए परीक्षण को संशोधित किया, और आर में वापस फीड करने के लिए अस्थायी मूल्य का उपयोग किया। अगर-और-श्रृंखला के रूप में स्विच तब लगभग दोगुना है।
बोनिल

8

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

मैं कई अन्य पोस्टरों से सहमत हूं, हालांकि ... इस बारे में चिंता करना समय से पहले हो सकता है, जब तक कि यह बहुत गर्म कोड न हो।


4
हॉट कोड टिप्पणी के लिए +1। यदि आपके मुख्य लूप में इसका समय से पहले न होना।
KingAndrew

हां, जेवैकswitch कई अलग-अलग तरीकों से लागू होता है, दूसरों की तुलना में कुछ अधिक कुशल। सामान्य तौर पर, दक्षता सीधे-सीधे " ifसीढ़ी" से अधिक खराब नहीं होगी , लेकिन पर्याप्त भिन्नताएं हैं (विशेषकर जेआईटीसी के साथ) कि यह उससे कहीं अधिक सटीक होना मुश्किल है।
हॉट लिक्स

8

अपने 2009 जावा क्लिफ के अनुसार एक बात आधुनिक हार्डवेयर में एक क्रैश कोर्स :

आज, प्रदर्शन मेमोरी एक्सेस के पैटर्न पर हावी है। कैशे हावी है - मेमोरी नई डिस्क है। [स्लाइड ६५]

आप उसकी पूरी स्लाइड यहाँ प्राप्त कर सकते हैं

क्लिफ एक उदाहरण देता है (स्लाइड 30 पर परिष्करण) दिखा रहा है कि सीपीयू के साथ रजिस्टर-रीनेमिंग, शाखा की भविष्यवाणी और सट्टा निष्पादन भी कर रहा है, यह केवल दो कैश मिस होने के कारण ब्लॉक होने से पहले 4 घड़ी चक्र में 7 ऑपरेशन शुरू करने में सक्षम है जो लेते हैं लौटने के लिए 300 घड़ी चक्र।

तो वह कहता है कि आप अपने कार्यक्रम को तेज करें, इस तरह के मामूली मुद्दे को नहीं देखना चाहिए, लेकिन बड़े लोगों पर जैसे कि आप अनावश्यक डेटा प्रारूप रूपांतरण कर रहे हैं, जैसे कि "सोप → XML → डोम → एसक्यूएल → ..." "जो" कैश के माध्यम से सभी डेटा पास करता है "।


4

मेरे परीक्षण में बेहतर प्रदर्शन है ENUM> MAP> SWITCH> IF / ELSE IF in Windows7।

import java.util.HashMap;
import java.util.Map;

public class StringsInSwitch {
public static void main(String[] args) {
    String doSomething = null;


    //METHOD_1 : SWITCH
    long start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);

        switch (input) {
        case "Hello World0":
            doSomething = "Hello World0";
            break;
        case "Hello World1":
            doSomething = "Hello World0";
            break;
        case "Hello World2":
            doSomething = "Hello World0";
            break;
        case "Hello World3":
            doSomething = "Hello World0";
            break;
        case "Hello World4":
            doSomething = "Hello World0";
            break;
        case "Hello World5":
            doSomething = "Hello World0";
            break;
        case "Hello World6":
            doSomething = "Hello World0";
            break;
        case "Hello World7":
            doSomething = "Hello World0";
            break;
        case "Hello World8":
            doSomething = "Hello World0";
            break;
        case "Hello World9":
            doSomething = "Hello World0";
            break;
        case "Hello World10":
            doSomething = "Hello World0";
            break;
        case "Hello World11":
            doSomething = "Hello World0";
            break;
        case "Hello World12":
            doSomething = "Hello World0";
            break;
        case "Hello World13":
            doSomething = "Hello World0";
            break;
        case "Hello World14":
            doSomething = "Hello World0";
            break;
        case "Hello World15":
            doSomething = "Hello World0";
            break;
        }
    }

    System.out.println("Time taken for String in Switch :"+ (System.currentTimeMillis() - start));




    //METHOD_2 : IF/ELSE IF
    start = System.currentTimeMillis();

    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);

        if(input.equals("Hello World0")){
            doSomething = "Hello World0";
        } else if(input.equals("Hello World1")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World2")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World3")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World4")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World5")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World6")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World7")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World8")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World9")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World10")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World11")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World12")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World13")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World14")){
            doSomething = "Hello World0";

        } else if(input.equals("Hello World15")){
            doSomething = "Hello World0";

        }
    }
    System.out.println("Time taken for String in if/else if :"+ (System.currentTimeMillis() - start));









    //METHOD_3 : MAP
    //Create and build Map
    Map<String, ExecutableClass> map = new HashMap<String, ExecutableClass>();
    for (int i = 0; i <= 15; i++) {
        String input = "Hello World" + (i & 0xF);
        map.put(input, new ExecutableClass(){
                            public void execute(String doSomething){
                                doSomething = "Hello World0";
                            }
                        });
    }


    //Start test map
    start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "Hello World" + (i & 0xF);
        map.get(input).execute(doSomething);
    }
    System.out.println("Time taken for String in Map :"+ (System.currentTimeMillis() - start));






    //METHOD_4 : ENUM (This doesn't use muliple string with space.)
    start = System.currentTimeMillis();
    for (int i = 0; i < 99999999; i++) {
        String input = "HW" + (i & 0xF);
        HelloWorld.valueOf(input).execute(doSomething);
    }
    System.out.println("Time taken for String in ENUM :"+ (System.currentTimeMillis() - start));


    }

}

interface ExecutableClass
{
    public void execute(String doSomething);
}



// Enum version
enum HelloWorld {
    HW0("Hello World0"), HW1("Hello World1"), HW2("Hello World2"), HW3(
            "Hello World3"), HW4("Hello World4"), HW5("Hello World5"), HW6(
            "Hello World6"), HW7("Hello World7"), HW8("Hello World8"), HW9(
            "Hello World9"), HW10("Hello World10"), HW11("Hello World11"), HW12(
            "Hello World12"), HW13("Hello World13"), HW14("Hello World4"), HW15(
            "Hello World15");

    private String name = null;

    private HelloWorld(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void execute(String doSomething){
        doSomething = "Hello World0";
    }

    public static HelloWorld fromString(String input) {
        for (HelloWorld hw : HelloWorld.values()) {
            if (input.equals(hw.getName())) {
                return hw;
            }
        }
        return null;
    }

}





//Enum version for betterment on coding format compare to interface ExecutableClass
enum HelloWorld1 {
    HW0("Hello World0") {   
        public void execute(String doSomething){
            doSomething = "Hello World0";
        }
    }, 
    HW1("Hello World1"){    
        public void execute(String doSomething){
            doSomething = "Hello World0";
        }
    };
    private String name = null;

    private HelloWorld1(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void execute(String doSomething){
    //  super call, nothing here
    }
}


/*
 * http://stackoverflow.com/questions/338206/why-cant-i-switch-on-a-string
 * https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-3.html#jvms-3.10
 * http://forums.xkcd.com/viewtopic.php?f=11&t=33524
 */ 

Time taken for String in Switch :3235 Time taken for String in if/else if :3143 Time taken for String in Map :4194 Time taken for String in ENUM :2866
हलील

@halil मुझे यकीन नहीं है कि यह कोड अलग-अलग वातावरणों पर कैसे काम करता है, लेकिन आपने उल्लेख किया है कि क्या / फारस स्विच और मैप से बेहतर है, कि मैं तब से मना नहीं कर पा रहा हूं, जब / फारस की तुलना में अधिक बार प्रदर्शन नहीं करना पड़ता है।
कानागावेलु सुगुमार

2

अधिकांश switchऔर अधिकांश if-then-elseब्लॉकों के लिए, मैं कल्पना नहीं कर सकता कि कोई प्रशंसनीय या महत्वपूर्ण प्रदर्शन संबंधी चिंताएं हैं।

लेकिन यहाँ एक बात है: यदि आप एक switchब्लॉक का उपयोग कर रहे हैं , तो इसका बहुत उपयोग बताता है कि आप संकलन समय पर ज्ञात स्थिरांक के सेट से लिए गए मान पर स्विच कर रहे हैं। इस मामले में, switchयदि आप enumनिरंतर-विशिष्ट विधियों के साथ उपयोग कर सकते हैं , तो आपको वास्तव में बयानों का उपयोग नहीं करना चाहिए ।

एक switchबयान की तुलना में , एक एनम बेहतर प्रकार की सुरक्षा और कोड प्रदान करता है जिसे बनाए रखना आसान होता है। Enums डिज़ाइन किया जा सकता है ताकि यदि स्थिरांक को स्थिरांक के सेट में जोड़ दिया जाए, तो आपका कोड नए मान के लिए एक निरंतर-विशिष्ट विधि प्रदान किए बिना संकलन नहीं करेगा। दूसरी ओर, caseएक switchब्लॉक में एक नया जोड़ने के लिए भूल जाना कभी-कभी केवल चलाने के समय में पकड़ा जा सकता है यदि आप भाग्यशाली हैं कि आपने एक अपवाद फेंकने के लिए अपने ब्लॉक को सेट किया है।

के बीच switchऔर एक enumस्थिर-विशिष्ट विधि का प्रदर्शन काफी भिन्न नहीं होना चाहिए, लेकिन बाद वाला अधिक पठनीय, सुरक्षित और बनाए रखने में आसान है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.