জাভা: সাবক্লাসের অধীনে এনাম সহ স্যুইচ স্টেটমেন্ট ব্যবহার করা


265

প্রথমে আমি জানিয়ে দেব যে আমি সি # তে এনামগুলির সাথে অনেক বেশি পরিচিত এবং মনে হচ্ছে জাভাতে এনামগুলি বেশ গণ্ডগোল।

আপনি দেখতে পাচ্ছেন, আমি আমার পরবর্তী উদাহরণে @ এনামগুলিতে একটি সুইচ স্টেটমেন্ট ব্যবহার করার চেষ্টা করছি তবে আমি যা করছি তা সবসময়ই আমি একটি ত্রুটি পাই।

আমি প্রাপ্ত ত্রুটিটি হ'ল:

যোগ্য কেস লেবেল SomeClass.AnotherClass.MyEnum.VALUE_Aঅবশ্যই অযোগ্য এনাম ধ্রুবকের সাথে প্রতিস্থাপন করতে হবেVALUE_A

বিষয়টি হ'ল আমি ত্রুটিটি বেশ বুঝতে পেরেছি তবে এনামটি অন্য একটি সাব-ক্লাসে অবস্থিত হওয়ায় আমি কেবল VALUE_A লিখতে পারি না। এই সমস্যাটি সমাধান করার কোনও উপায় আছে কি? আর জাভাতে কেন হচ্ছে?

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        MyEnum enumExample //...

        switch (enumExample) {
            case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
                //..
                break;
            }
        }
    }
}

Darrengorman মন্তব্য হিসাবে, জাভা Enumহয় অত্যন্ত কুশলী একবার আপনি তাদের পেতে আসে - সব একটি জগাখিচুড়ি না। এগুলি অন্যান্য প্ল্যাটফর্মে যেমন দেখা যায় তেমন সহজ এনামগুলি (কেবলমাত্র একটি লেবেলযুক্ত পূর্ণসংখ্যার মান) এর চেয়ে অনেক বেশি নমনীয় এবং ব্যবহারিক। দেখুন ওরাকল টিউটোরিয়াল । অনুকূলিত Set/ Mapপ্রয়োগগুলি আবিষ্কার করুন : EnumSet& EnumMap
বাসিল বাউরক

1
যখন আপনি কেস স্টেটমেন্টটি যোগ্য করার চেষ্টা করবেন; একটি উপায়ে, আপনি বলার চেষ্টা করছেন যে আমি একক সুইচ স্টেটমেন্টের মধ্যে বিভিন্ন ধরণের এনাম (কেবল একই এনাম টাইপ নয়) মিশ্রিত করতে পারি। এখানে আলোচনা হিসাবে জাভা এই পদ্ধতির সাথে এটি বন্ধ করে দিয়েছে digizol.com/2010/10/enum-
کیس-

ইন্টেলিজেজে 2018.2 এ ক্লাসটি রিফ্যাক্ট করার সময় (মুভিং) করার সময় আমার সাথে এটি ঘটেছিল
ড্যানিয়েল অ্যাল্ডার

উত্তর:


570

এটিতে এটি পরিবর্তন করুন:

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

ক্লুটি ত্রুটিতে রয়েছে। আপনার caseএনাম টাইপের সাথে লেবেলগুলি যোগ্য করার দরকার নেই , কেবল এটির মান।


20
ঠিক আছে আমি খুব বোকা বোধ করছি :-( আপনি পুরোপুরি ঠিক বলেছেন, আমি নিশ্চিত হয়েছি যে আমি এই সঠিক লাইনটি চেষ্টা করেছিলাম এবং এর সাথে একটি ত্রুটি পেয়েছি তাই আমি মামলাটি যোগ্য হয়ে
উঠতে পেরেছি

4
যেভাবে আমি মনে করি আপনি জাভাতে
এনামগুলি

11
@ মিল্কপ্লসভেলসোলেট, আমি জানি এই পোস্টটি ইতিমধ্যে পুরানো, তবে আমি আগ্রহী যে কেন জাভা সুইচ স্টেটমেন্টে যোগ্য কেস লেবেলের অনুমতি দেয় না ?
জার্সিউলো

3
@ cRane01 নিশ্চিতভাবে জানেন না তবে এটি ক্লিনার সিনট্যাক্স তৈরি করে। প্রতিটি ক্ষেত্রে প্রকার নির্দিষ্ট করে দেওয়া
নিখরচায়

3
@ হেলো গুডবাই নং। স্যুইচ স্টেটমেন্টের পরিবর্তনশীল কেস স্টেটমেন্টের ধরণ নির্ধারণ করে যাতে এটি কেবল একটি এনাম হতে পারে।
স্প্রিন্টার

33

জাভা স্বয়ংক্রিয়ভাবে উপাদানগুলির প্রকারটি নির্ধারণ করে case, সুতরাং লেবেলগুলি অবশ্যই অযোগ্য হতে হবে।

int i;
switch(i) {
   case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
   case VALUE_A: // <- an element of the enumeration is expected
}

14
কেন নয় এটা অযোগ্য হবে?
থরবজর্ন রাভন অ্যান্ডারসন

11
আপনি যদি যোগ্যতা অর্জন করতে পারতেন তবে আপনি অন্য কিছু ব্যবহার করতে পারেন MyEnumযার অর্থ হবে না।
ক্রু

1
@Kru, কিন্তু আমি করতে পারেন অ enum টাইপ কেস এক্সপ্রেশন জন্য ব্যাকরণগতভাবে-অন্য কিছু ব্যবহার করুন। যেমন static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}পরিবর্তে case 7। সুতরাং এনামগুলির জন্য এই বিধিনিষেধটি কোনও অর্থ দেয় না (আমি কেবল প্রাথমিক আক্ষরিক ব্যবহার করতে পারি না, তবে পূর্ণসংখ্যার জন্য ম্যানুয়ালি সংজ্ঞায়িত ধ্রুবকগুলিও ব্যবহার করতে পারিswitch এক্সপ্রেশনটির করতে পারি না, তবে আমি ম্যানুয়ালি সংজ্ঞায়িত ধ্রুবকগুলি ব্যবহার করতে পারি না, তবে কেবল এনামগুলির জন্য প্রাথমিক নামগুলি ব্যবহার করতে পারি))।
সাশা

4

এটি করা উচিত:

//Main Class
public class SomeClass {

    //Sub-Class
    public static class AnotherClass {
        public enum MyEnum {
            VALUE_A, VALUE_B
        }    
        public MyEnum myEnum;
    }

    public void someMethod() { 
        AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...

        switch (enumExample) {
            case VALUE_A: { //<-- error on this line
            //..
            break;
            }
        }
    }
}

তুমি দিন বাঁচিয়েছ!
সোহম মেহতা


2

এইভাবে আমি এটি ব্যবহার করছি। এবং এটি দুর্দান্তভাবে কাজ করছে -

public enum Button {
        REPORT_ISSUES(0),
        CANCEL_ORDER(1),
        RETURN_ORDER(2);

        private int value;

        Button(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }

এবং switch-caseনীচে প্রদর্শিত হিসাবে

@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
    switch (button) {
        case REPORT_ISSUES: {
            break;
        }
        case CANCEL_ORDER: {
            break;
        }
        case RETURN_ORDER: {
            break;
        }
    }
}

0

someMethod()এভাবে লিখুন :

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

স্যুইচ বিবৃতিতে আপনাকে অবশ্যই ধ্রুবক নামটি ব্যবহার করতে হবে।

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