জাভা সুইচগুলির মধ্যে ভেরিয়েবলগুলি ঘোষণা এবং প্রারম্ভিককরণ


100

জাভা সুইচ সম্পর্কে আমার একটি ক্রেজি প্রশ্ন আছে।

int key = 2;

switch (key) {
    case 1:
        int value = 1;
        break;
    case 2:
        value = 2;
        System.out.println(value);
        break;
    default:
        break;
}

দৃশ্যপট 1 - যখন keyদুই এটা সফলভাবে যেমন 2. মান প্রিন্ট
যখন আমি মন্তব্য করতে যাচ্ছি - দৃশ্যপট 2 value = 2মধ্যে case 2:এটা বলার অপেক্ষা রাখে squawks স্থানীয় পরিবর্তনশীল মান সক্রিয়া করা নাও হতে পারে

প্রশ্নসমূহ:

পরিস্থিতি 1: যদি মৃত্যুদণ্ড কার্যকর প্রবাহটি case 1:(যখন key = 2) না যায়, তবে এটি মান পরিবর্তনশীলের প্রকারটি কীভাবে জানতে পারে int?

পরিস্থিতি 2: সংকলক যদি মান ভেরিয়েবলের প্রকারটি জেনে থাকে intতবে অবশ্যই এটি int value = 1;প্রকাশ করতে হবে case 1:((ঘোষণা এবং প্রারম্ভিককরণ)। তাহলে কেন এটা sqawrk যখন আমি মন্তব্য করতে যাচ্ছি না value = 2যে case 2:বললেন, স্থানীয় পরিবর্তনশীল মান সক্রিয়া করা নাও হতে পারে


13
এটি কোনও পাগল প্রশ্ন নয়, এটি খুব ভাল প্রশ্ন।
বিজিকলপ


@ ফিলিপ্পেরিরিয়ার আসলে, আমি মনে করি এটি বিপরীত হওয়া উচিত - জেএলএসের প্রত্যক্ষ রেফারেন্স থাকায় এখানে উত্তরটি আরও ভাল (পোস্টটি আরও নতুন হলেও) এবং পোস্টটির বিভিন্ন উত্তরে coveredাকা ইস্যুটির সংক্ষিপ্তসার জানিয়েছে। এছাড়াও দেখুন
তুনাকি

@ তুনাকী নকলটির বিবরণ "এই প্রশ্নটি আগে জিজ্ঞাসা করা হয়েছিল" দিয়ে শুরু হয়। আমি পড়ছি যে পরেরটি আগেরটির সদৃশ হিসাবে চিহ্নিত করা উচিত। তবে আমি একমত যে এই এক সুন্দর উপাদান আছে। তারা একরকম একীভূত করা উচিত?
ফিলিপ ক্যারিয়ার

এছাড়াও এসও-তে অনেকগুলি প্রশ্ন আমার মূল প্রশ্নের সদৃশ হিসাবে চিহ্নিত হয়েছে, সুতরাং আপনি যদি সিদ্ধান্ত নেন যে এটিকে নতুন মূল হিসাবে চিহ্নিত করা ভাল তবে দয়া করে আমার পরিবর্তে এটিকে উল্লেখ করার জন্য সমস্ত লিঙ্কগুলি ঠিক করুন।
ফিলিপ ক্যারিয়ার

উত্তর:


115

মূলত স্কোপিংয়ের ক্ষেত্রে স্যুইচ স্টেটমেন্টগুলি বিজোড়। জেএলএস এর 6.3 ধারা থেকে :

একটি ব্লকের স্থানীয় ভেরিয়েবল ঘোষণার সুযোগ (.414.4) যেখানে ব্লকের বাকী অংশটি যেখানে ঘোষণাপত্রটি উপস্থিত হয় তার নিজস্ব আরম্ভকারী দিয়ে শুরু করে এবং স্থানীয় ভেরিয়েবল ঘোষণার বিবৃতিতে ডানদিকে আরও কোনও ঘোষককে অন্তর্ভুক্ত করে।

আপনার ক্ষেত্রে, case 2একই হয় ব্লক হিসাবে case 1এবং প্রদর্শিত হবার পরে এটা, যদিও case 1চালানো হবে না ... তাই স্থানীয় পরিবর্তনশীল সুযোগ রয়েছে এবং এর জন্য উপলব্ধ লেখা আপনি সত্ত্বেও কথাটি কখনোই "নির্বাহ" ঘোষণা। (প্রারম্ভিক হওয়া সত্ত্বেও একটি ঘোষণা সত্যই "কার্যকর" নয়))

আপনি যদি এই value = 2;অ্যাসাইনমেন্টটি মন্তব্য করেন তবে সংকলকটি এখনও জানে যে আপনি কোন পরিবর্তনশীল উল্লেখ করছেন, তবে আপনি কোনও নির্বাহের পথ দিয়ে যান নি যা এটির একটি মূল্য নির্ধারণ করে, তাই আপনি চেষ্টা করার সময় আপনি যেমন একটি ত্রুটি পেয়েছেন অন্য কোনও-নির্দিষ্টভাবে-নির্দিষ্ট করা স্থানীয় ভেরিয়েবলটি পড়ুন।

আমি আপনাকে দৃ strongly়ভাবে সুপারিশ করব না অন্যান্য ক্ষেত্রে ঘোষিত স্থানীয় ভেরিয়েবলগুলি ব্যবহার করার জন্য - এটি আপনারা যেমন দেখেছেন তেমন বিভ্রান্তিকর কোডের দিকে নিয়ে যায়। আমি যখন স্যুইচ স্টেটমেন্টগুলিতে স্থানীয় ভেরিয়েবলগুলি প্রবর্তন করি (যা আমি খুব কমই করার চেষ্টা করি - কেসগুলি খুব ছোট হওয়া উচিত, আদর্শভাবে) আমি সাধারণত একটি নতুন সুযোগ প্রবর্তন করতে পছন্দ করি:

case 1: {
    int value = 1;
    ...
    break;
}
case 2: {
    int value = 2;
    ...
    break;
}

আমি বিশ্বাস করি এটি আরও পরিষ্কার।


11
"একটি ঘোষণাপত্রের জন্য +1 সত্যিকার অর্থেই" এক্সিকিউটেবল "নয় যদিও ইনিশিয়েশন রয়েছে"। এবং খুব স্কিটি পরামর্শ দেওয়ার জন্য আপনাকে ধন্যবাদ।
নামফলারানডলোক

4
জেপি -325 সংহত হওয়ার সাথে সাথে স্থানীয় ভেরিয়েবলের ক্ষেত্রের চিত্র পরিবর্তিত হয়েছে এবং কেউই স্যুইচ ব্লকগুলির পরিবর্তে কেসগুলি জুড়ে একই নাম ব্যবহার করতে পারে। যদিও এটি একই ধরণের ব্লক কোডিংয়ের উপরও নির্ভর করে। এছাড়াও, প্রতি স্যুইচ কেস পরিবর্তিত হিসাবে নির্ধারিত মানটি স্যুইচ এক্সপ্রেশনগুলির সাথে অনেক সুবিধাজনক হবে।
নামান

ধনুর্বন্ধনী সহ একটি নতুন সুযোগ যুক্ত করার জন্য পয়েন্টস। এমনকি আপনি জানেন না যে আপনি এটি করতে পারেন।
ভাসমান সানফিশ

21

ভেরিয়েবলটি ঘোষিত হয়েছে (অন্তর্নিহিত হিসাবে), তবে আরম্ভ করা হয়নি (প্রাথমিক মান নির্ধারিত)। লাইনটি ভাবুন:

int value = 1;

যেমন:

int value;
value = 1;

int valueঅংশ কম্পাইল সময়ে কম্পাইলার বলে যে আপনি একটি পরিবর্তনশীল মান যা কোন int বলা আছে। value = 1অংশ এটা সূচনা, কিন্তু যে রান সময়ে ঘটে, এবং সব সময়ে ঘটে না যদি সুইচ যে শাখা প্রবেশ করা হয় না।


সংকলন সময় এবং রানটাইমের সময় ঘোষণা এবং আরম্ভের চমৎকার ব্যাখ্যা করার জন্য +1 for
নামফলারানডলোক

18

Http://www.coderanch.com/t/447381/java-programmer-SCJP/cerificationsation/variable-initialization-within- کیس- block থেকে

ঘোষণাগুলি সংকলন সময়ে প্রক্রিয়াজাত করা হয় এবং আপনার কোডের প্রয়োগের প্রবাহের উপর নির্ভর করে না। যেহেতু valueস্যুইচ ব্লকের স্থানীয় ক্ষেত্রের মধ্যে ঘোষণা করা হয়েছে, তাই এটির ঘোষণার দিক থেকে এটি ব্লকের যে কোনও জায়গায় ব্যবহারযোগ্য।


4
কেন এই উত্তর upvated হচ্ছে? এটি পল বা স্কিটের জবাবের বিপরীতে প্রশ্নের উত্তর দেয় না ...
ধ্রুব গায়রোলা

7
এটা করে. সুতরাং, আমার কাছ থেকেও +1, একটি পয়সা।
রবীন্দ্র রেড্ডি

3

জেপি 325 এর একীকরণের সাথে : জেডিকে -12 প্রারম্ভিক অ্যাক্সেস তৈরিতে স্যুইচ এক্সপ্রেশন (পূর্বরূপ) । কিছু পরিবর্তন রয়েছে যা জনের উত্তর থেকে দেখা যেতে পারে -

  1. স্থানীয় পরিবর্তনীয় সুযোগ - স্যুইচ ক্ষেত্রে স্থানীয় ভেরিয়েবলগুলি এখন পুরো সুইচ ব্লকের পরিবর্তে কেসটিতে স্থানীয় হতে পারে। আরও উদাহরণেরDayজন্য এনাম ক্লাসবিবেচনা করে জোন সিনট্যাক্টিক্যালি যেমন চেষ্টা করেছিল তার অনুরূপ একটি উদাহরণ:

    public enum Day {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }
    
    // some another method implementation
    Day day = Day.valueOf(scanner.next());
    switch (day) {
        case MONDAY,TUESDAY -> {
            var temp = "mon-tue";
            System.out.println(temp);
        }
        case WEDNESDAY,THURSDAY -> {
            var temp = Date.from(Instant.now()); // same variable name 'temp'
            System.out.println(temp);
        }
        default ->{
            var temp = 0.04; // different types as well (not mandatory ofcourse)
            System.out.println(temp);
        }
    }
    
  2. এক্সপ্রেশনগুলি স্যুইচ করুন - যদি অভিপ্রায়টি কোনও ভেরিয়েবলের জন্য একটি মান নির্ধারণ করতে হয় এবং তারপরে এটি ব্যবহার করা হয় তবে একবার স্যুইচ এক্সপ্রেশনগুলি ব্যবহার করতে পারেন। যেমন

    private static void useSwitchExpression() {
        int key = 2;
        int value = switch (key) {
            case 1 ->  1;
            case 2 -> 2;
            default -> {break 0;}
        };
        System.out.println("value = " + value); // prints 'value = 2'
    }
    

0

এই ব্যাখ্যা সাহায্য করতে পারে।

    int id=1;

    switch(id){
        default: 
            boolean b= false; // all switch scope going down, because there is no scope tag

        case 1:
            b = false;
        case 2:{
            //String b= "test"; you can't declare scope here. because it's in the scope @top
            b=true; // b is still accessible
        }
        case 3:{
            boolean c= true; // case c scope only
            b=true; // case 3 scope is whole switch
        }
        case 4:{
            boolean c= false; // case 4 scope only
        }
    }

0

জাভা স্পেস:

https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.11

লেবেলের সাথে ব্রেক হওয়ার কারণে হঠাৎ সমাপ্তির ক্ষেত্রে লেবেলযুক্ত বিবৃতিগুলির জন্য সাধারণ নিয়ম দ্বারা পরিচালনা করা হয় (.714.7)।

https://docs.oracle.com/javase/specs/jls/se12/html/jls-14.html#jls-14.7

লেবেলযুক্ত বিবৃতি:

লেবেল স্টেটমেন্ট: আইডেন্টিফায়ার: বিবৃতি

লেবেল স্টেটমেন্ট ননশোর্টআইফ: আইডেন্টিফায়ার: স্টেটমেন্টনোশোর্টআইফ

সি এবং সি ++ এর বিপরীতে জাভা প্রোগ্রামিং ভাষার কোনও গোটো স্টেটমেন্ট নেই; সনাক্তকারী স্টেটমেন্ট লেবেলগুলি বিরতি (14.15) বা অবিরত (§14.16) লেবেল স্টেটমেন্টের মধ্যে যে কোনও জায়গায় উপস্থিত হওয়া স্টেটমেন্টগুলির সাথে ব্যবহৃত হয়।

লেবেলযুক্ত বিবৃতিটির লেবেলের সুযোগটি অবিলম্বে থাকা বিবৃতি।

অন্য কথায়, কেস 1, কেস 2 হ'ল স্যুইচ স্টেটমেন্টের মধ্যে লেবেল। ব্রেক এবং অবিরত বিবৃতিগুলি লেবেলে প্রয়োগ করা যেতে পারে।

লেবেলগুলি বিবৃতিটির সুযোগ ভাগ করার কারণে লেবেলের মধ্যে সংজ্ঞায়িত সমস্ত ভেরিয়েবলগুলি স্যুইচ স্টেটমেন্টের সুযোগ ভাগ করে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.