2016-10-31 9 views
3

이클립스에 다음 코드를 입력하면 "대문자 표현식이 상수 표현식이어야한다"고 불평합니다. 배열에 final으로 표시된 경우 해당 내용은 일정해야합니다. 왜 이것이 유효하지 않습니까?switch 문에서 최종 변수를 사용할 수없는 이유는 무엇입니까?

final String[] match={"a","b","c"}; 
switch (switchVar) { 
case match[0]: /* Eclipse complains here about nonconstant switch */ 
    System.out.println("Matches"); 
    break; 
default: 
    System.out.println("No Match"); 
    break; 
} 

답변

6

배열에 대해 상수는 없습니다. 그 내용은 언제든지 변경 될 수 있습니다. 참조은 동일하게 말할 것이지만 match[0]은 어느 시점에서든 다를 수 있습니다.

에는이 있으며 상수 값을 사용합니다. 하나는 변하지 않을 것을 보장합니다. 열거 형, 프리미티브 리터럴 (및 박스형 대응 물) 및 String 리터럴은이 프로세스를 통해 변경되지 않으며, 사용하기에 적합합니다.

입니다. 그러나 final으로 표시된 변수를 사용할 수는 있지만 변경할 수는 없습니다. 배열 유형은이므로 변경할 수 있습니다. 변수를 final 변수에 재 할당하더라도 마찬가지입니다. 리터럴을 선언해야합니다.

여기에 기존 코드를 수정, 아래의 간단한 코드 조각입니다 : 배열이 최종 표시됩니다

String switchVar = "a"; 
final String matchZero = "a"; 
switch (switchVar) { 
    case matchZero: // valid since there's no way matchZero can ever be mutated 
     System.out.println("Matches"); 
     break; 
    default: 
     System.out.println("No Match"); 
     break; 
} 
+0

견적은 '이 점을 강조하지 않습니다'. 문법은 다음과 같습니다 :'SwitchLabel : case ConstantExpression : case EnumConstantName : default :'. 인용문은 '스위치'부분에서 스위치 표현 자체의 내부에 들어가는 것에 관한 것입니다. – EJP

+0

@EJP : 조금 혼란 스러울 수 있습니다. 나는 동의한다. 나는 그것을 새롭게 바꿨다. – Makoto

+0

'혼란스럽게'? 그것은 무의미했다. – EJP

1

경우, 그 내용이 일정해야합니다.

이것은 잘못된 이해입니다. 최종 변수는 생성되는 배열의 새 인스턴스 만 방지하지만 변경되는 배열의 내용을 막지는 못합니다. 나는 기존의 코드와 함께이 작업을 수행 할 수 있으며이 유효합니다 :

final String[] match = {"a", "b", "c"};   
    match[0] = "b"; // CHANGE HERE 
    switch (switchVar) { 
     case "a": //Fixing this to make it compile 
      /* Eclipse complains here about nonconstant switch */ 
      System.out.println("Matches"); 
      break; 
     default: 
      System.out.println("No Match"); 
      break; 
    } 

코드 컴파일하려면 스위치 문을 사용하여, 당신은 상수를 사용해야합니다. 따라서 상수 또는 장소 문자열을 선언하면 효과가 있습니다. The Java Language Specification on switch statements 모두 문을 전환 가정은 상수 표현식에서 작동하게하기 때문에

final String[] match = {"a", "b", "c"};   
    switch (switchVar) { 
     case "a": // CHANGE HERE 
      /* Eclipse complains here about nonconstant switch */ 
      System.out.println("Matches"); 
      break; 
     default: 
      System.out.println("No Match"); 
      break; 
    } 

이는 이유는 간단하다.

0

질문의 요점은

final String[] match = {"a", "b", "c"}; 

이 배열 일치의 주소가 변경 될 수 없음을 의미, '최종'이지만 그렇지 배열 macth의 값이 변경 될 수 없음을 의미합니다.

사례 명세서에 상수가 필요합니다.

관련 문제