2016-06-21 7 views
0

이것은 사소한 질문이지만이 점은 완전히 흥미 롭습니다. 부재에도 직접 외부 클래스에서의 인스턴스없이 액세스 할 수 없다 (비 고정) 내부 클래스 '로내부 클래스로 선언 될 때 switch 문에서 enum 값의 동작

,

및 u는 외부 클래스 hai.x와 범위에있는 고정 상수를 액세스하는 동안; 하지만 "enum 스위치를 대문자로 사용"의 경우에는 다른 방법으로 보입니다. 모양 dostuff2()

경우 RED : 작동하지만 경우 value.RED는 열거 스위치 케이스 라벨 내가 문 위에 알고

말한다 상수 열거의 규정되지 않은 이름이어야합니다 오류 을 제공합니다 그것 모두는, 난 그냥 궁금 해서요

만약 우리가 가치 '라고 생각한다면 컴파일러. '모든 상수를 전환 .. 을이뿐만 아니라 값 v 열거의 정상 declartion의 경우되지 않는 이유 =

public class enumvalues 
{ 
    public enum values 
    { 
     RED,GREEN,VALUE  
    } 
    public class hai 
    { 
     static final int x=90;      
    } 
    public static class statichai 
    { 

    } 
    public static void main(String []args) 
{ 

} 

    public void dostuff2(values v) 
    { 
     // v =RED this is illegal 

     // System.out.println(RED); this will not compile because it cannot be accessed directly 
     // System.out.println(x); this will not compile because it cannot be accessed directly 



     switch(v) 
     { 
      case RED: //use of value.RED is strictly forbidden 
      System.out.println("red"); 
     } 
    } 
} 
+0

'value.RED' 또는'values.RED'를 시도 했습니까? (후자의 'values'에's '가 표시됨) – Abubakkar

+0

열거 형 값은 일반적으로 정규화되어야합니다. 스위치 케이스의 경우에만 짧은 표기가 가능합니다. _ 그 것이 전부입니다. _ –

+0

그건 자바 프로그래밍 언어의 규칙 일뿐입니다. "왜"라는 질문에 대한 명확한 대답은 없습니다. Java 언어의 설계자는 이것이 좋은 생각이라고 생각했기 때문입니다. 어떤 종류의 열거 형이 이미 켜져 있는지 분명하기 때문에'case'에'RED' 대신'values.RED'를 사용하면 불필요한 자세한 설명 만 할 수 있습니다. – Jesper

답변

1

RED는 검사에 대한 열거 형에 대한 특별한 경우를 만들 필요하기 때문에. 또 다른 예

interface SomeInterface{} 
enum Values implements SomeInterface {RED}; 
enum MoreValues implements SomeInterface {RED}; 

public void dostuff2(SomeInterface value) 
{ 
value = RED; 
} 

그것은 당신과 당신의 코드와 매우 유사하며, dostuff2 정확히 동일을 고려한다. 컴파일러 열거 형에 대한 후드는 정규 클래스입니다. 예제를 처리하기 위해 열거 형을 처리하기 위해 특별한 대소 문자를 추가해야했습니다.