最初に、C#の列挙型に精通していることを述べます。Javaの列挙型はかなり混乱しているようです。
ご覧のとおり、次の例ではswitch文@ enumsを使用しようとしていますが、何をしていても常にエラーが発生します。
私が受け取るエラーは:
修飾されたケースラベル
SomeClass.AnotherClass.MyEnum.VALUE_A
は、修飾されていない列挙定数VALUE_A
に置き換える必要があります
問題は、Iquiteがエラーを理解することですが、enumは別のサブクラスにあるため、VALUE_Aを書くことはできません。この問題を解決する方法はありますか?そして、なぜJavaで起こっているのですか?
//Main Class
public class SomeClass {
//Sub-Class
public static class AnotherClass {
public enum MyEnum {
VALUE_A, VALUE_B
}
public MyEnum myEnum;
}
public void someMethod() {
MyEnum enumExample //...
switch (enumExample) {
case AnotherClass.MyEnum.VALUE_A: { <-- error on this line
//..
break;
}
}
}
}
これに変更します:
switch (enumExample) {
case VALUE_A: {
//..
break;
}
}
手がかりはエラーにあります。 case
ラベルを列挙型で修飾する必要はなく、その値だけを修飾します。
Javaはcase
の要素のタイプを自動的に推測するため、ラベルは非修飾である必要があります。
int i;
switch(i) {
case 5: // <- integer is expected
}
MyEnum e;
switch (e) {
case VALUE_A: // <- an element of the enumeration is expected
}
これはすべきです:
//Main Class
public class SomeClass {
//Sub-Class
public static class AnotherClass {
public enum MyEnum {
VALUE_A, VALUE_B
}
public MyEnum myEnum;
}
public void someMethod() {
AnotherClass.MyEnum enumExample = AnotherClass.MyEnum.VALUE_A; //...
switch (enumExample) {
case VALUE_A: { //<-- error on this line
//..
break;
}
}
}
}
これは私がそれを使用している方法です。そして、それは素晴らしく機能しています-
public enum Button {
REPORT_ISSUES(0),
CANCEL_ORDER(1),
RETURN_ORDER(2);
private int value;
Button(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
そして、以下に示すようにswitch-case
@Override
public void onClick(MyOrderDetailDelgate.Button button, int position) {
switch (button) {
case REPORT_ISSUES: {
break;
}
case CANCEL_ORDER: {
break;
}
case RETURN_ORDER: {
break;
}
}
}
違う:
case AnotherClass.MyEnum.VALUE_A
右:
case VALUE_A:
この方法でsomeMethod()
を記述します。
public void someMethod() {
SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;
switch (enumExample) {
case VALUE_A:
break;
}
}
Switchステートメントでは、定数名のみを使用する必要があります。