জাভা সুইচ স্টেটমেন্ট সহ এনাম ব্যবহার করে


106

আমি এই প্রশ্নের অনুরূপ বিভিন্ন প্রশ্নোত্তর হিসাবে দেখেছি কিন্তু এর সমাধান খুঁজে পাইনি।

আমার কাছে যা আছে তা হ'ল একটি এনাম যা কোনও টিভি গাইড দেখার বিভিন্ন উপায়ে প্রতিনিধিত্ব করে ...

এনড্রয়েড Applicationক্লাসে

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

... যখন ব্যবহারকারী পরিবর্তনটি কোনও ইভেন্ট হ্যান্ডলার int0-2 থেকে প্রাপ্ত করে এবং আমি এর মতো কিছু করতে চাই ...

একটি অ্যান্ড্রয়েড Activity onClick(DialogInterface dialog, int which)ইভেন্ট হ্যান্ডলারে

// 'which' is an int from 0-2
switch (which) {
    case NDroid.guideView.GUIDE_VIEW_SEVEN_DAY:
    ...
    break;
}

আমি সি # এনামগুলিতে অভ্যস্ত এবং সিলেক্ট / কেস স্টেটমেন্টগুলি ব্যবহার করেছি যা উপরের মতো কিছু করার অনুমতি দেয় এবং আমি জানি জাভা বিভিন্নভাবে কাজ করে তবে আমার কী করা দরকার তা আমি ঠিক বুঝতে পারি না।

আমি কি ifবিবৃতি অবলম্বন করতে যাচ্ছি ? সম্ভবত কেবলমাত্র 3 টি পছন্দ থাকবে তাই আমি এটি করতে পারি তবে আমি জাভাতে স্যুইচ-কেস দিয়ে কীভাবে এটি করা যেতে পারে তা ভেবে অবাক হয়েছিল।

সম্পাদনা দুঃখিত দুঃখিত আমি এটিকে জেনারিক জাভা ইস্যু হিসাবে দেখছিলাম বলে আমি পুরোপুরি প্রসারিত হয়নি। আমি আরও কিছুটা ব্যাখ্যা করার জন্য প্রশ্নটিতে যুক্ত করেছি।

অ্যান্ড্রয়েড নির্দিষ্ট কিছু নেই যা এই কারণেই আমি এটিকে অ্যান্ড্রয়েড হিসাবে ট্যাগ করি নি তবে এনাম Applicationক্লাসে এবং কোডটি যেখানে আমি স্যুইচটি চাই না তা সংজ্ঞায়িত করা হয়েছে Activity। এনাম স্থিতিশীল হিসাবে আমার একাধিক ক্রিয়াকলাপ থেকে এটি অ্যাক্সেস করা দরকার।


1
case GUIDE_VIEW_SEVEN_DAYযথাযথ আমদানির পরে ঠিক হওয়া উচিত ; আপনার কি কি সমস্যা হচ্ছে?
ডেভ নিউটন

আপনি কি কেবল নিজের ইভেন্ট হ্যান্ডলারটিকে এনাম গ্রহণ করতে পারবেন না? এটি বাদ দিয়ে, সম্ভবত এটি সাহায্য করবে: stackoverflow.com/questions/5292790/…
ব্রায়ান রোচ

@ ডেভ: ওফস দুঃখিত, কোডটি কীভাবে তা দেখানোর জন্য আমি সংশোধন করেছি। ইগ্রিপস আমাকে টাইপ মিসর্ম্যাচ ত্রুটি দিচ্ছে এটি গাইড ভিউ থেকে ইনটে রূপান্তর করতে পারে না বলে।
স্কোঙ্ক

@ ব্রায়ান: এটি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন এবং ইভেন্ট হ্যান্ডলারটি আমার OnClickListener দ্বারা DialogInterfaceপ্রয়োগ করা ইন্টারফেস দ্বারা সংজ্ঞায়িত ।
স্কোঙ্ক

@ মিস্টার এসকনক ওহ, আমি মিস করেছি আপনি এটি কোনও পূর্ববর্তী সময় থেকে পেয়েছেন - দুঃখিত, ওপিডিয়ান এর উত্তর দেখুন, যদিও আমি কার্যকারিতাটি এনামে রেখেছি।
ডেভ নিউটন

উত্তর:


162

আপনি যে অংশটি হারিয়েছেন তা পূর্ণসংখ্যা থেকে টাইপ-সেফ এনামে রূপান্তরিত হচ্ছে। জাভা স্বয়ংক্রিয়ভাবে এটি করবে না। আপনি আরও কয়েকটি উপায় যেতে পারেন:

  1. কোনও প্রকার-নিরাপদ এনামের চেয়ে স্থির চূড়ান্ত অন্তরের তালিকা ব্যবহার করুন এবং আপনি প্রাপ্ত ইনট মানটি স্যুইচ করুন (এটি পূর্ব জাভা 5 পদ্ধতির)
  2. হয় একটি নির্দিষ্ট আইডি মান ( heneryville দ্বারা বর্ণিত হিসাবে ) বা এনাম মানগুলির মূল মান স্যুইচ করুন ; অর্থাতguideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. ইন্ট মান দ্বারা প্রতিনিধিত্ব করা এনাম মান নির্ধারণ করুন এবং তারপরে এনাম মানটি স্যুইচ করুন।

    enum GuideView {
        SEVEN_DAY,
        NOW_SHOWING,
        ALL_TIMESLOTS
    }
    
    // Working on the assumption that your int value is 
    // the ordinal value of the items in your enum
    public void onClick(DialogInterface dialog, int which) {
        // do your own bounds checking
        GuideView whichView = GuideView.values()[which];
        switch (whichView) {
            case SEVEN_DAY:
                ...
                break;
            case NOW_SHOWING:
                ...
                break;
        }
    }

    আপনার পছন্দসই valueOfপ্রয়োগটি লিখতে আপনি আরও সহায়ক / কম ত্রুটির প্রবণতা পেতে পারেন যা উপযুক্ত এনাম মানটি সমাধান করার জন্য আপনার পূর্ণসংখ্যার মানকে যুক্তি হিসাবে গ্রহণ করে এবং আপনাকে আপনার সীমানা পরীক্ষার কেন্দ্রীভূত করতে দেয়।


অনেক ধন্যবাদ. এটি আমার কোডটিতে কাজ করতে আমাকে কিছুটা সময় লেগেছে তবে আপনি পোস্ট করেছেন উদাহরণ কোডটি দিয়ে এখন এটি দুর্দান্তভাবে কাজ করছে। সি # এর সাথে 6 বছর এবং জাভা সহ 1 বছর - এটি প্রায়শই আসে না যে আমাকে এমন কিছু দেয় যা আমাকে আটকে দেয়। অনেক মিল তবে মাঝে মাঝে এর মতো একটি যা খুব আলাদা। আমি তাড়াহুড়ো করে এটিকে ভুলব না। :-)
স্কোঙ্ক

2
আপনার কেস স্টেটমেন্টে অযোগ্য এনাম নামগুলি দরকার, তাই case GuideView.SEVEN_DAY:সংকলনের ত্রুটি দেয়, এটি হওয়া উচিত case SEVEN_DAY:
haridsv

এটা দুর্দান্ত ভাই !!
নিও

41

তাহলে whichViewGuideView Enum একটি অবজেক্ট হয়, নিম্নলিখিত ভাল কাজ করে। অনুগ্রহ করে নোট করুন যে পরে ধ্রুবক জন্য কোন যোগ্যতা নেই case

switch (whichView) {
    case SEVEN_DAY:
        ...
        break;
    case NOW_SHOWING:
        ...
        break;
}

4
এটা কীভাবে সম্ভব ?!
জেসে চেরগুই

12

এনামগুলিকে আপনার লেবেলের মতো কেস লেবেলে NDroid.guideView.GUIDE_VIEW_SEVEN_DAYযোগ্যতা দেওয়া উচিত নয়, পরিবর্তে আপনার যোগ্যতা এবং ব্যবহারটি সরিয়ে নেওয়া উচিতGUIDE_VIEW_SEVEN_DAY


এটি পছন্দ করে। সরল!
অলস নিনজা

5

আমি জাভা এনামের কয়েকটি ব্যবহার পছন্দ করি:

  1. .name () আপনাকে স্ট্রিংয়ে এনামের নাম আনতে দেয়।
  2. .ordinal () আপনাকে 0-ভিত্তিক পূর্ণসংখ্যা মান পেতে দেয়।
  3. আপনি প্রতিটি এনামের সাথে অন্যান্য মান প্যারামিটার সংযুক্ত করতে পারেন।
  4. এবং, অবশ্যই, স্যুইচ সক্ষম।

মান পরামিতি সহ এনাম:

    enum StateEnum {
        UNDEFINED_POLL  ( 1 * 1000L,       4 * 1000L),
        SUPPORT_POLL    ( 1 * 1000L,       5 * 1000L),
        FAST_POLL       ( 2 * 1000L,  4 * 60 * 1000L),
        NO_POLL         ( 1 * 1000L,       6 * 1000L); 
        ...
    }

সুইচ উদাহরণ:

private void queuePoll(StateEnum se) {
    // debug print se.name() if needed
    switch (se) {
        case UNDEFINED_POLL:
            ...
            break;
        case SUPPORT_POLL:
            ...
            break;

3

এটি আপনার বর্ণনা অনুসারে কাজ করা উচিত। আপনি কি ত্রুটি পাচ্ছেন? আপনি যদি আপনার কোডটি পেস্টবিন করতে পারেন যা সহায়তা করবে।

http://download.oracle.com/javase/tutorial/java/javaOO/enum.html

সম্পাদনা: আপনি কি একটি স্ট্যাটিক এনাম সংজ্ঞায়িত করতে নিশ্চিত? এটা আমার কাছে ঠিক শোনাচ্ছে না। একটি এনাম অনেকগুলি অন্য বস্তুর মতো। যদি আপনার কোডটি সংকলন করে এবং চালিত হয় তবে ভুল ফলাফল দেয় তবে সম্ভবত এটিই হবে।


"নেস্টেড এনাম প্রকারগুলি সুস্পষ্টভাবে স্থিতিশীল। স্পষ্টভাবে কোনও নেস্টেড এনাম প্রকারটিকে স্থির হিসাবে ঘোষণা করা অনুমোদিত" "- জেএলএস §8.9
ট্র্যাশগোড

@ ট্র্যাশগোড, প্রকৃতপক্ষে - তবে আমি সর্বদা বিভ্রান্তি এড়াতে অন্তর্নিহিত ঘোষণাটি ব্যবহার করব কারণ এটি আসলেই আরও স্পষ্ট আইএমও। একটি গ্লোবাল স্ট্যাটিক এনাম (যা আমি এটি অনুমান করি) বেশিরভাগ ক্ষেত্রে সম্ভবত ভুল।
সিস্টেমপারাডক্স

2
enumerations accessing is very simple in switch case

private TYPE currentView;

//declaration of enum 
public enum TYPE {
        FIRST, SECOND, THIRD
    };

//handling in switch case
switch (getCurrentView())
        {
        case FIRST:
            break;
        case SECOND:
            break;
        case THIRD:
            break;
        }

//getter and setter of the enum
public void setCurrentView(TYPE currentView) {
        this.currentView = currentView;
    }

    public TYPE getCurrentView() {
        return currentView;
    }

//usage of setting the enum 
setCurrentView(TYPE.FIRST);

avoid the accessing of TYPE.FIRST.ordinal() it is not recommended always

এটি কেবলমাত্র তখনই কাজ করে যদি আপনি বাহ্যিকভাবে আপনার ডেটা না পান। যেহেতু ওপি বলেছে যে কোন মানটি 1, 2, 3 টিওয়াইপি নয়, আপনার পদ্ধতিটি বিপরীত সুইচ কেস না করে কাজ করবে না যা 1, 2, 3 লাগে এবং তার তালিকাভুক্ত সুইচ কেসে যাওয়ার আগে একটি
টিওয়াইপি দেয়

2

সংক্ষিপ্ত সহযোগী কার্যকারিতা উদাহরণ:

public String getIcon(TipoNotificacao tipo)
{
    switch (tipo){
        case Comentou : return "fa fa-comments";
        case ConviteEnviou : return "icon-envelope";
        case ConviteAceitou : return "fa fa-bolt";
        default: return "";
    }
}

@ ধনুশকা যেমন বলেছিলেন, "স্যুইচ" এর ভিতরে বাছাইপর্বটি বাদ দেওয়া চাবিকাঠি।


1

আমি এটা মত করছি

public enum State
{
    // Retrieving, // the MediaRetriever is retrieving music //
    Stopped, // media player is stopped and not prepared to play
    Preparing, // media player is preparing...
    Playing, // playback active (media player ready!). (but the media player
                // may actually be
                // paused in this state if we don't have audio focus. But we
                // stay in this state
                // so that we know we have to resume playback once we get
                // focus back)
    Paused; // playback paused (media player ready!)

    //public final static State[] vals = State.values();//copy the values(), calling values() clones the array

};

public State getState()
{
        return mState;   
}

এবং স্যুইচ স্টেটমেন্ট ব্যবহার করুন

switch (mService.getState())
{
case Stopped:
case Paused:

    playPause.setBackgroundResource(R.drawable.selplay);
    break;

case Preparing:
case Playing:

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