2017-09-10 1 views
6

당신이 3 개 값을 열거 있다고 가정 나중에 그런Java에서 enum의 모든 정의 된 값을 전환하는 것을 강제 할 수있는 방법이 있습니까?</p> <pre><code>enum Colors { RED, GREEN, BLUE } </code></pre> <p>당신은 모든 경우에 처리 한 생각, 어떤 방법으로 그것의 모든 값을 전환 :

switch (colors) { 
    case RED: ... 
    case GREEN: ... 
    case BLUE: ... 
} 

을, 당신은 추가 열거에 새로운 값 :

enum Colors { RED, GREEN, BLUE, YELLOW } 

그리고 당신은 자동 방법 YELLOW에 대한 사례를 놓치고 제외한 모든 여전히 잘 컴파일합니다. 이러한 시나리오에서 컴파일 타임 오류를 발생시킬 수있는 방법이 있습니까?


편집 :이 Can I add and remove elements of enumeration at runtime in Java의 속는을 표시 한 이유 이해하지 마십시오. 대답은 "아니오"이므로 컴파일 타임에 열거 형의 모든 값을 알 수 있어야하므로 컴파일러/일부 코드 분석 도구를 구현할 수 있어야합니다. ?

+0

'default : throw new UnsupportedOperationException();'? – tkausl

+5

@Colonder 확실히 그 질문의 중복이 아닙니다. –

+0

@Colonder 이걸 속임수로 표시하지 마십시오. 제발? :) –

답변

6

이는 컴파일러에 따라 다릅니다. 이 경우 Eclipse IDE 내장 컴파일러를 구성하여 오류를 발생시킬 수 있습니다.

Java 컴파일러 오류/경고 "열거 형의 사례가 불완전합니다"를 "오류"로 설정할 수 있습니다.

편집 :이

심지어 하위 옵션 " '기본'케이스가있는 경우에도 신호"입니다.

+0

흥미 롭습니다. 나는 이클립스가 그 기능을 가지고 있는지 몰랐다. 스위치에 기본 케이스 (런타임 예외가 발생 함)가 있으면 어떻게됩니까? 이 경우에 완성 된 것으로 간주됩니까? (미안, 빨리 테스트 할 일식 없음)? –

+1

@JB 방금 내 대답에 정보를 추가했습니다 –

+0

@ Raalf –

1

나는 이것을하는 기본 방법이 없다고 생각합니다. 일부 외부 도구로 가능할 수도 있습니다.

switch 문에 기본값을 제공하고 예외를 발생시키는 이유는 무엇입니까? 게다가이 시나리오를 테스트하기에 충분한 단위 테스트가 있어야합니다. 프로젝트를 컴파일하고 모든 유닛 테스트가 정상이면이 테스트가 충분하지 않을 수 있습니다.

+0

아마도 컴파일러에 남겨 두어야 할 _ 작업하지 않을 수도 있습니다. (물론 Java에서는 그렇게 할 수 없습니다. 수치 스럽습니다.) 이러한 검사에 대한 검사를 사용하는 것에 대한 귀하의 추론은 훨씬 더 넓은 의미로 적용될 수 있습니다. 그렇다면 왜 우리는 타입과 내용 그리고 컴파일 타임 체크를 가지고 있을까요? –

8

아니요. 그러나 열거 형은 클래스입니다. 그래서 당신은 다형성 사용할 수 있습니다 : 당신이 색상을 추가 할 경우, 지금

enum Color { 
    RED { 
     @Override 
     public void foo() { ... } 
    }, 
    GREEN { 
     @Override 
     public void foo() { ... } 
    }, 
    BLUE { 
     @Override 
     public void foo() { ... } 
    }; 

    public abstract void foo(); 
} 

를, 컴파일러는 그것이 추상 메소드를 오버라이드 (override)하지 않는 그것을 추가 할 수 없습니다. 코 틀린은 옵션 인 경우 코 틀린, 당신이 원하는 일을 할 수 있다는

대신

switch (color) { 
    case RED: ... 
    case GREEN: ... 
    case BLUE: ... 
} 

당신은

color.foo(); 

주를 사용할 수 있습니다.

또한 파란색은 색상이 아니라 색상입니다. 따라서 열거 형은 색이 아닌 색으로 지정되어야합니다.

+0

여기 Kotlin을 언급하는 것에 대한 위로 엄지! –

+0

정확하게, 조건을 다형성으로 대체하는 것은이를 해결하는 OOP 방법입니다. –

+0

이것은 정말 흥미로운 대답입니다. 그래도 내 '색상'열거 형에 논리를 넣고 싶지는 않습니다. 하하 :) 이것은 본질적으로 열거 형을 인터페이스로 바꾸고 있습니다. –

관련 문제