私が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ステートメントで)。
しかし、それを行うと、次のようなエラーが発生します。
シンボルが見つかりません-クラスステータス
どうすれば修正できますか?
列挙型スイッチのケースラベルは、列挙型定数の非修飾名でなければなりません:
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の 関連記事 に感謝します。)
getStatus()
が実際にStatus
を返す場合、ケースは次のようになります。
case Opened:
あなたがしようとすると:
case Test.Status.Opened:
あなたのIDEはあなたに次のようなエラーを与えます:
an enum switch case label must be the unqualified name of an enumeration constant
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 }
_
Status
enumはTest
クラスに含まれているため、Status
の代わりにTest.Status
を使用する必要があります。
列挙型は(多かれ少なかれ)他のクラスと同じなので、ここでのルールは他の内部クラスと同じです。ここでは、おそらく列挙型クラスをstatic
として宣言するつもりでした。それは、その包含クラスのメンバーに依存していません。その場合、Test.Status.Opened
は、それを参照する正しい方法です。クラスが静的であることを本当に意味しない場合は、おそらく「名前空間」修飾子としてインスタンスを使用する必要があります。つまり、test.Status.Opened
。
編集:どうやら列挙型は暗黙的に静的です。これは、列挙型がどうあるべきかを考えればある程度の意味がありますが、明示的に静的として宣言するのはおそらく良い形です。
私はクラスで列挙型を次のように宣言しました:
パブリッククラス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);
}
これで問題が解決しました。あるクラスの列挙型を別のクラスで使用しているときはいつでも、静的メソッドのようにクラスを介してアクセスする必要があります。
この例で試してください
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;
}