2013-07-20 9 views
17

(참고 : 편집 질문, 이전의 의도는 분명하지 않다)switch 문에서 열거 형 값을 정규화 할 수없는 이유는 무엇입니까?

이 코드를 고려가 :

public final class Foo 
{ 
    private enum X 
    { 
     VALUE1, VALUE2 
    } 

    public static void main(final String... args) 
    { 
     final X x = X.VALUE1; 

     switch (x) { 
      case VALUE1: 
       System.out.println(1); 
       break; 
      case VALUE2: 
       System.out.println(2); 
     } 
    } 
} 

이 코드는 잘 작동합니다.

그러나, 나는 대체 할 경우 :

case VALUE1: // or VALUE2 

로 :

case X.VALUE1: // or X.VALUE2 

다음 컴파일러는 불평 :

자바 : /path/to/Foo.java:whatever : 열거 형 스위치 사례 레이블은 열거 상수의 규정되지 않은 이름이어야합니다.

JLS에서이 견적 16,

SO suggests an answer :

(상수 인라인 필요한 이유 중 하나는 스위치 문은 각각의 경우에 상수를 필요로하고, 두 개의 이러한 상수 값은 동일 할 수 없다. 컴파일러는 컴파일 타임에 switch 문에서 중복 상수 값을 확인합니다. 클래스 파일 형식은 대문자와 소문자의 기호 연결을하지 않습니다.)

그러나 이것은 만족스럽지 않습니다. 내가 아는 한 VALUE1X.VALUE1은 완전히 동일합니다. 따옴표로 묶인 텍스트는 나에게 전혀 설명하지 않는다.

여기서 enum 값이 switch 문으로 작성되어야한다는 것을 JLS에서 정의합니까?

+6

을 선택 자바 언어 스펙이 그렇게 말하기 때문입니다. 당신이 결핍 된 것으로 링크 된 제안 된 답변에 대해 무엇입니까? –

+1

내가 염려하는 한 'VALUE1' 또는'X.VALUE1'은 모두 같은 상수이기 때문에; 후자를 전 대신 사용할 수없는 이유가 없습니다. – fge

+1

나는 그것이 단순함을 의심한다 - 결국, 특정 switch 문에있는 모든 * case는 같은 유형이어야한다. 왜 당신은 여분의 융통성을 원하지만 JLS를 더 복잡하게 만들까요? –

답변

9

SwitchLabel는 열거 상수 식별자로 정의 된 EnumConstantName를 기대 which is unqualified :

EnumConstant :
주석 선택 하 식별자 인수 그것은 단순히이다 ClassBody에게 선택 하

+0

감사합니다. 나는 그들 사이의 연결을 찾을 수없는 JLS의이 두 가지 점을 우연히 발견했다. – fge

관련 문제