web-dev-qa-db-ja.com

Java異なるクラスの列挙型を使用していますか?

私がJavaにこのようなクラスを持っている場合:

public class Test
{
    // ...
    public enum Status {
        Opened,
        Closed,
        Waiting
    }
    // ...
}

そして、私は別のクラスファイルに別のクラスを持っています(しかし同じプロジェクト/フォルダーにあります):

public class UsingEnums
{
    public static void Main(String[] args)
    {
        Test test = new Test(); // new Test object (storing enum)

        switch(test.getStatus()) // returns the current status
        {
            case Status.Opened:
                // do something
            // break and other cases
        }
    }
}

あるクラスに列挙型を効果的に配置し、別のクラスで使用します(私の場合、具体的にはswitch-caseステートメントで)。

しかし、それを行うと、次のようなエラーが発生します。

シンボルが見つかりません-クラスステータス

どうすれば修正できますか?

28
Bhaxy

列挙型スイッチのケースラベルは、列挙型定数の非修飾名でなければなりません:

switch (test.getStatus()) // returns the current status
{
    case Opened:
        // do something
        // break and other cases
}

別のクラス内で定義されているかどうかは関係ありません。いずれの場合でも、コンパイラはswitchステートメントに基づいて列挙型を推測でき、定数名を修飾する必要はありません。何らかの理由で、修飾名の使用は無効な構文です。

この要件は JLS§14.11 で指定されています。

SwitchLabel:
   case ConstantExpression :
   case EnumConstantName :
   default :

EnumConstantName:
   Identifier

(参考までにMark Petersの 関連記事 に感謝します。)

79
Paul Bellora

getStatus()が実際にStatusを返す場合、ケースは次のようになります。

case Opened:

あなたがしようとすると:

case Test.Status.Opened:

あなたのIDEはあなたに次のようなエラーを与えます:

an enum switch case label must be the unqualified name of an enumeration constant
10
talnicolas

NVM

それは完全に修飾されていない必要があり、修飾はswitch() ed変数のタイプ(この場合はtest.getStatus()、_Test.Status_)によって与えられます。


あなたの_Enum Status_はあなたの_class Test_の一部です。そのため、それを修飾する必要があります。

_    Test test = new Test(); // new Test object (storing enum)

    switch(test.getStatus()) // returns the current status
    {
        case Test.Status.Opened:
            // do something
        // break and other cases
    }
_
2
Kevin

Status enumはTestクラスに含まれているため、Statusの代わりにTest.Statusを使用する必要があります。

2
GETah

列挙型は(多かれ少なかれ)他のクラスと同じなので、ここでのルールは他の内部クラスと同じです。ここでは、おそらく列挙型クラスをstaticとして宣言するつもりでした。それは、その包含クラスのメンバーに依存していません。その場合、Test.Status.Openedは、それを参照する正しい方法です。クラスが静的であることを本当に意味しない場合は、おそらく「名前空間」修飾子としてインスタンスを使用する必要があります。つまり、test.Status.Opened

編集:どうやら列挙型は暗黙的に静的です。これは、列挙型がどうあるべきかを考えればある程度の意味がありますが、明示的に静的として宣言するのはおそらく良い形です。

1
amalloy

私はクラスで列挙型を次のように宣言しました:

パブリッククラスMyBinaryTree {

private Node root;
public enum ORDER_TYPE {
    IN_ORDER, POST_ORDER,
};

    public void printTree(ORDER_TYPE order) {
    //Printing tree here
    }

}

そして私は別のクラスでこれにアクセスしようとしていました

パブリッククラスSolution1 {

/**
 * @param args
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    MyBinaryTree myTree = new MyBinaryTree();
            myTree.printTree(myTree.ORDER_TYPE.POST_ORDER);
   }

}

ここでの問題は、インスタンスオブジェクトを使用してORDER_TYPE列挙にアクセスすると、コンパイル時エラーが発生することです: "ORDER_TYPEを解決できないか、フィールドではありません"

もう一度チェックして、クラス名を名前修飾子として直接使用するようにコードを変更しました

public static void main(String[] args) {
 MyBinaryTree myTree = new MyBinaryTree();
 myTree.printTree(MyBinaryTree.ORDER_TYPE.POST_ORDER);
}

これで問題が解決しました。あるクラスの列挙型を別のクラスで使用しているときはいつでも、静的メソッドのようにクラスを介してアクセスする必要があります。

1
Amitesh Sinha

この例で試してください

switch(test.getStatus()) {

     case FILE : 
            fullList.addAll(getFileMensionList(session, search, authUser));
            break;
     case EVENT :
            fullList.addAll(getEventMensionList(session, search, authUser));
            break;
     case POLL :
            fullList.addAll(getPollMensionList(session, search, authUser));
            break;
     case PROJECT :
            fullList.addAll(getProjectMensionList(session, search, authUser));
            break;
     case TASK :
            fullList.addAll(getTaskMensionList(session, search, authUser));
            break;
}
0
Jefin Stephan