web-dev-qa-db-ja.com

Java switchステートメントで列挙型を使用

この質問に似たSOに関するさまざまなQ&Aを見てきましたが、解決策が見つかりませんでした。

私が持っているのは、TVガイドを表示するさまざまな方法を表す列挙型です...

NDroid Applicationクラス

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

...ユーザーがビューを変更すると、イベントハンドラーは0-2からintを受け取り、このようなことをしたいと思います...

Android ActivityonClick(DialogInterface dialog, int which)イベントハンドラー

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

私は上記のようなものを許可するC#列挙とselect/case文に慣れており、Javaは異なることをすることを知っていますが、何をする必要があるのか​​理解できません。

ifステートメントに頼らなければなりませんか?おそらく3つの選択肢しかありませんので、私はそれを行うことができますが、Javaのスイッチケースを使用してどのように行うことができるのか疑問に思いました。

EDIT申し訳ありませんが、この問題は一般的なJava問題であると考えていたため、完全には展開していませんでした。質問に追加して、もう少し説明します。

Android固有のものはないため、Androidとしてタグ付けしませんでしたが、列挙型はApplicationクラスとスイッチを使用しないコードで定義されていますActivityにあります。複数のアクティビティからアクセスする必要があるため、列挙型は静的です。

101
Squonk

不足している部分は、整数から型保証された列挙型への変換です。 Javaは自動的にそれを行いません。これについては、いくつかの方法があります。

  1. タイプセーフな列挙型ではなく静的な最終整数型のリストを使用して、受け取った整数値をオンにします(これはJava 5より前のアプローチです)
  2. 指定されたid値( heneryvilleで記述 )または列挙値の序数値のいずれかをオンにします。すなわちguideView.GUIDE_VIEW_SEVEN_DAY.ordinal()
  3. Int値で表される列挙値を決定し、列挙値をオンにします。

    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実装を作成する方が、より便利でエラーが少ないことがわかります。

152
Ophidian

whichViewがGuideView Enumのオブジェクトである場合、以下が適切に機能します。 caseの後に定数の修飾子がないことに注意してください。

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

列挙は、NDroid.guideView.GUIDE_VIEW_SEVEN_DAYのようにケースラベル内で修飾しないでください。代わりに、修飾を削除してGUIDE_VIEW_SEVEN_DAYを使用する必要があります。

12
Piyush Mattoo

Java enumのいくつかの使用法が好きです:

  1. .name()を使用すると、Stringの列挙名を取得できます。
  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;
5
david m lee

これは、説明したとおりに機能するはずです。どのようなエラーが発生していますか?コードを貼り付けることができれば助かります。

http://download.Oracle.com/javase/tutorial/Java/javaOO/enum.html

編集:静的列挙型を定義してもよろしいですか?それは私には正しく聞こえません。列挙型は、他のオブジェクトとよく似ています。コードをコンパイルして実行しても、誤った結果が得られる場合、これがおそらく理由です。

3
SystemParadox

短い連想関数の例:

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 "";
    }
}

@Dhanushkaが言ったように、「switch」内の修飾子を省略することが重要です。

2
Auston
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
2
Jaya

私はそれをやっている

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ステートメントで使用します

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

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

case Preparing:
case Playing:

    playPause.setBackgroundResource(R.drawable.selpause);
    break;    
}
1
Xar E Ahmer