런타임에 실행할 때마다 적합한 분기를 찾게 된다는 점에서
각 switch 문을 완성해야 합니다.
이는 실제로 다음 사항 모두를 고려할 때 중요한 태스크입니다.
또한, JLS는 예상치 못한 컴파일 시간 오류의 원인이 될 수 있는 enum switch 문에 대한 플로우 분석을 수행하도록 합니다.
enum Colors { RED, GREEN, BLUE }
String colorString(Color c) {
switch(c) {
case RED: return "red";
case GREEN: return "green";
case BLUE: return "blue";
}
}
컴파일러는 다음과 같이 응답합니다.
"이 메소드는 유형 String의 결과를 리턴해야 합니다. 'switch'에서 'default:'가 누락되는 문제점이 방지되며, 아마도 해당 문제점과 관련되어 있습니다."
이러한 메시지는 완성도에 대한 여러 개념을 사용자에게 알리도록 디자인되었습니다. JLS에서 수행해야 하는 플로우 분석은 모든(현재 알려진) enum 상수를 나열하는 경우에도 기본 case가 없는 각 enum switch 문을 불완전한 것으로 간주합니다. 이는 로컬 변수 또는 공백인 최종 필드의 확실한 지정 및 return 문과 관련됩니다.. 하지만, 다음 모든 권장사항을 따르는 경우에는, 위의 오류 메시지가 나타나지 않습니다.
다양한 레벨의 불완전성을 보고하려면 개별 구성 옵션에 대한 컴파일러 환경 설정을 참조하십시오. 차후 여러 디자인 목표와 정책, 그리고 Eclipse Java 컴파일러를 사용하여 확인하는 방법에 대해 논의합니다.
가장 좋은 방법으로, 각 switch 문에 의미 있는 기본 분기가 있어야 하며, 이러한 기본 분기에서는 "항상 합리적인" 전략을 사용하여 명시적으로 나열되지 않는 모든 case를 처리합니다. 분명히 이와 같은 전략은 대부분의 경우 찾기 어렵거나 불가능하지만 의미 있는 기본 구현을 찾을 수 있다면 그것이 가장 좋은 솔루션입니다.
컴파일러가 누락된 기본 case에 대해 경고하지만 기본적으로 수행할 합리적인 작업이 아무 것도 처리하지 않음인 경우, 문서화를 수행하는 편이 좋습니다.
default: 레이블을 추가해야 합니다.
이렇게 하여 컴파일러가
기본 case에 대해 잊지 않도록 설정합니다.
합리적인 기본 구현을 찾을 수 없는 경우, 최후의 수단으로 예상치 못한 값이 차후에 다른 오류의 근본 원인이 되지 않게 할 수 있습니다. 예를 들어, 런타임 시 미리 실패합니다.
default:
case를 추가하십시오.
각 switch 문이 위의 세 가지 카테고리 중 하나에 지정 가능해야 합니다. 이는 컴파일러가 각 기본 case 누락에 대해 경고하게 하는 것이 공통적으로 올바른 전략임을 나타냅니다.
enum 값에 대한 switch를 수행하는 경우, 해당 case 문으로 각 enum 상수를 명시적으로 처리하는 것이 좋습니다.
모든 enum switch가 모든 enum 상수를 다뤄야 하는 옵션을 원하지 않지만 일부 enum switch 문의 case 레이블이 누락되었다는 경고를 수신하려는 경우, 개별 enum switch 문에 대한 전략을 선택해야 합니다.
String colorString2(Color c) {
switch(c) {
case RED: return "red";
case GREEN: return "green";
//$CASES-OMITTED$
default:
return "unknown color";
}
}
힌트: 컴파일러가 "enum 상수 BLUE에 색상에 대한 해당 enum switch의 올바른 case 레이블이 있어야 함"과 같은 내용을 보고하는 경우, 태그 주석 삽입에 대한 빠른 수정사항이 제공됩니다.
위의 고려사항은 불완전 switch 문에 대한 모든 선택적 경고를 사용하는 경우
컴파일러에서 대부분의 도움을 받을 수 있고, 빈 문서화된 기본 case 및 //$CASES-OMITTED$
태그 주석을 사용하여 디자인별로 불완전성이 허용되는 해당 switch 문을 표시함을 나타냅니다.
이러한 권장사항을
따르면 하나 이상의 열거 상수를 나중에 추가하는 상황을 포함하여 분기가 우연히 생략되는 경우, 관련된 모든 경고나 오류(원하는 경우)를 받게 됩니다. 이 최대 완성도의 모든 예외가 코드로 문서화되며 더 이상 경고로 플래그 지정되지 않습니다.
컴파일러가 런타임 시 불일치 클래스 버전 사용을 막을 수 없으므로 클래스를 enum 유형의 이전 버전에 대해 컴파일할 수 있지만 실행 중인 애플리케이션에서 enum 유형에 추가 enum 상수가 있을 수 있습니다. 이러한 상황 또는 이와 유사한 상황의 경우, 적합한 "포괄적" 기본 구현이 런타임 예외를 발생시켜 이러한 불일치에 대해 알리고 오류가 애플리케이션에 전파되는 것을 막을 수 있습니다.
위에서 엄격한 컴파일러 설정의 추가 값이 권장되므로, 위에 표시된 누락된 return 문에 대한 모호한 오류 메시지(또는 초기화되지 않은 변수에 대한 유사 메시지)는 더 이상 나타나지 않습니다.