1. ホーム
  2. java

[解決済み] enumとswitch文の組み合わせによるJava

2022-09-23 08:07:45

質問

この質問に似たようなSOのQ&Aをいろいろ見てみましたが、解決策が見つかりませんでした。

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

NDroidでは Application クラス

static enum guideView {
    GUIDE_VIEW_SEVEN_DAY,
    GUIDE_VIEW_NOW_SHOWING,
    GUIDE_VIEW_ALL_TIMESLOTS
}

...ユーザーがビューを変更したとき、イベントハンドラは int を受け取るので、このような処理を行いたいと思います。

アンドロイドで Activity onClick(DialogInterface dialog, int which) イベントハンドラ

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

私はC#のenumとselect/caseステートメントに慣れていて、上記のようなことが可能です。

私は if ステートメントに頼らなければならないのでしょうか?選択肢は3つしかないだろうからできるけど、Javaのswitch-caseではどうなんだろうと思って。

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

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

どのように解決するのですか?

あなたが見落としている部分は、整数からタイプセーフなenumへの変換です。 Javaは自動的にそれを行いません。 これには2つの方法があります。

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

    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 実装を書いた方が、より便利でエラーが起こりにくいと思うかもしれません。