Java : 서브 클래스에서 enum과 함께 switch 문 사용


265

먼저 C #의 열거 형에 훨씬 익숙하며 Java의 열거 형이 상당히 엉망인 것처럼 보입니다.

보시다시피, 다음 예제에서 switch 문 @ enums를 사용하려고하지만 내가하는 일에 관계없이 항상 오류가 발생합니다.

내가받는 오류는 다음과 같습니다

규정 된 케이스 레이블 SomeClass.AnotherClass.MyEnum.VALUE_A은 규정되지 않은 열거 상수로 교체되어야합니다.VALUE_A

문제는 오류를 상당히 이해하지만 열거 형이 다른 하위 클래스에 있기 때문에 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;
            }
        }
    }
}

darrengorman이 언급했듯이 Java Enum는 일단 혼란스러워하지 않으면 매우 편리합니다. 다른 플랫폼에서 볼 수 있듯이 단순한 열거 형 (단순히 레이블이 지정된 정수 값)보다 훨씬 유연하고 실용적입니다. Oracle Tutorial을 참조하십시오 . 최적화 된 Set/ Map구현을 발견하십시오 : EnumSet& EnumMap.
Basil Bourque

1
사례 진술을 검증하려고 할 때; 어떤 식으로, 단일 switch 문 내에서 다른 유형의 열거 형 (동일한 열거 형이 아닌)을 혼합 할 수 있다고 말하려고합니다. Java는 여기에 설명 된 대로이
lkamal

IntelliJ 2018.2에서 클래스를 리팩토링 (이동)하는 동안 이런 일이 일어났습니다.
Daniel Alder

답변:


570

이것을 다음과 같이 변경하십시오.

switch (enumExample) {
    case VALUE_A: {
        //..
        break;
    }
}

실마리가 잘못되었습니다. case열거 형 유형으로 레이블 을 한정 할 필요가 없으며 그 값만 있습니다.


20
Ok 나는 너무 바보 같은 느낌 :-( 당신은 완전히 맞아, 나는이 정확한 라인을 시도하고 그와 함께 오류가있어서 사건을 인정하기 위해 움직 였지만 당신의 제안은 작동합니다.
Popokoko

4
그건 그렇고 당신이 자바에서 열거 형이 더 많이 사용하기 시작하면 엄청나게 유용하다는 것을 알게 될 것이라고 생각합니다.) : 나는 그들이 엉망이라고 말하지 않을 것입니다 :)
darrengorman

11
@ milkplusvellocet, 나는이 게시물이 이미 오래되었다는 것을 알고 있지만 왜 Java가 switch 문에서 한정 된 대소 문자 레이블 을 허용하지 않는지 궁금 합니다.
jzarsuelo

3
@ cRane01은 확실하지 않지만 구문을 더 깨끗하게 만듭니다. 각각의 경우에 유형을 지정하면 완전히 중복 될 것이다
darrengorman

3
@HelloGoodbye 아니요. switch 문의 변수는 case 문의 유형을 정의하므로 하나의 열거 형 만 될 수 있습니다.
스프린터

33

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
}

14
자격이없는 이유 무엇 입니까?
Thorbjørn Ravn Andersen

11
자격 MyEnum이된다면 말이되지 않는 다른 것을 사용할 수 있습니다 .
Kru

1
@Kru, 열거 형이 아닌 경우 표현식에는 문법적으로 다른 것을 사용할 있습니다. 예 static final int MY_CONST = 7; …; switch(intVariable) {case MY_CONST: …;}대신 case 7. 따라서 열거 형에 대한이 제한은 의미 가 없습니다 (기본 리터럴뿐만 아니라 정수 switch식에 수동으로 정의 된 상수도 사용할 수 있지만 수동으로 정의 된 상수는 사용할 수 없지만 열거 형에는 기본 이름 만 사용할 수 있습니다).
사샤

4

이것은해야합니다 :

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

당신은 하루를 저장했습니다!
Soham Mehta


2

이것이 내가 사용하는 방법입니다. 그리고 그것은 환상적으로 일하고 있습니다-

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

0

someMethod()이런 식으로 작성 하십시오 :

public void someMethod() {

    SomeClass.AnotherClass.MyEnum enumExample = SomeClass.AnotherClass.MyEnum.VALUE_A;

    switch (enumExample) {
    case VALUE_A:
        break;
    }

}

switch 문에서는 상수 이름 만 사용해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.