2012-04-10 5 views
4

내가 자바 1.5 (java.lang 패키지)은 <E는 열거을 확장 <E>>

public abstract class Enum<E extends Enum<E>> {... 
}.. 

에 정의되어이 클래스를 확장하고 구현할 수있는 다음과 같은 문제를 통해 발견 내가 가진 문제는 다른 서수 값을 가진 내 자신의 enum 형식을 만드는 것입니다. 나는 getCode() 등등과 같은 서수의 다른 이름을 사용하여 구현하고 싶지 않다. 그래서 나는 위의 클래스를 확장하는 길로 갈 수 있다고 생각했다.

public final class XYZ extends Enum<XYZ> { //Does not work. 
    // 
    A("A", 1), 
    B("B", 7); 
    . 
} 

나는 다음 작업을 수행 할 수 있다는 것을 알고 :

public enum NEWEnum { 
    A(1), 
    B(7); 

    private int code; 
    private NEWEnum(int code) { 
    this.code = code; 
    } 
    public int getCode() { 
    return this.code; 
    } 
} 

내가 열거의 같은 서수() 대신 이름()에 보통 인 이름을 선호한다.

+0

@RayToal '서수'와 '이름'이 최종임을 압니다. 문제는 왜 내가 위에서 열거 형 클래스에서 확장 할 수 없다는 것입니다. 확장 할 수 있다면'name'과'ordinal'을위한 매개 변수를 가진 protected 생성자를 호출 할 수 있어야합니다. – khmarbaise

답변

5

이렇게 Enum을 확장 할 수 없습니다. 컴파일러 나 런타임에 내장되어 있습니다.

하지만 문제를 해결하려고하는 것처럼 보입니다. 열거 형 값의 서수는 아무런 기능적 의미도 갖지 않습니다. 당신이 그것을주는대로, 그것은 '서신'과 다른 이름을 가져야합니다. 두 번째 코드 스 니펫은 첫 번째 스 니펫보다 훨씬 우수합니다.

일반적으로 서수에 의존하는 것은 나쁜 습관입니다. 그것은 아마도 처음부터 노출되어서는 안됩니다. 당신이 의지 할 수있는 유일한 것은 당신이 당신 자신에게 부여한 이름과 가치입니다.

'ordinal'필드의 이름을 지정하는 것이 중요한 경우을 사용하십시오. Enum은 그저 구현 된 것입니다.

+0

나는 ordinal()에 의존하는 것이 나쁜 습관이라는 것을 알고 있지만, 나는 레거시 코드를 가지고 있으며 그에 대처해야한다.그래서 열거 형 패턴을 가야 해요. – khmarbaise

4

Enum은 컴파일러에서 특별한 대우를받으며 EnumSet과 같은 클래스는이 처리를 기반으로 가정을합니다. ordinal()name()과 같은 Enum 메서드의 동작은 엄격하게 정의되며이 동작을 복제하기 위해 직접 구현하면 의미가 없습니다. 또한 enum 값을 선언하는 구문은 enum에서만 유효하며 class에서는 컴파일되지 않습니다.

ordinal()을 절대 사용해서는 안되므로 문제에 맞게 정의하는 것이 바람직하지 않습니다.

+0

ordinal()과 name() new를 구현하고 싶지 않습니다. 나는 불가능한 것 같은 추상 Enum 클래스에서 확장 할 수 없게되었습니다. ordinal() 문제는 내가 호환해야하는 레거시 코드가 있다는 것입니다. 나는 ordinal()을 없애지 않을 것이지만 현재 나는 기회가 없다. – khmarbaise

+0

@khmarbaise java에서 구체적인 ordinal() 값을 얻는 유일한 방법은 열거 형 값을 정렬하고 필러 값을 추가하는 것입니다. 첫 번째 값 0을 1로 설정합니다.이 때문에 아무도 ordinal()을 직접 사용해야하지 않습니다). 유일한 다른 방법은 ASM 또는 BCEL 같은 컴파일로 결과 바이트 코드를 수정하는 것입니다 (결코 그렇게하지 않았고 복잡 할 수도 있음). – josefx

1

Enum 클래스는 Enum 언어 기능을 구현하는 데 사용되므로 Java에서는 특수 클래스입니다. 따라서 Java의 다른 클래스와 같은 클래스 일뿐만 아니라 더 특별합니다 (예 : String, + 연산자가 오버로드되거나 상자 클래스와 유사). 이러한 기능이 작동하려면 특수 요구 사항이 열거 형에 필요합니다 (예 : 연속 된 서수와 같음). 따라서 Java 언어 사양 explicitly forbidsEnum 클래스로부터 수동으로 상속됩니다.

0

열거 형은 언어 핵심 및 특수 용도에서 특별한 의미가 있습니다. 따라서 일반 클래스에서는 불가능한 switch 문에서 사용할 수 있습니다.

0

예를 들어 명시 적으로 구현하면 생성자에서 "name"및 "ordinal"속성을 초기화 할 필요가 없습니다. 나중에 NPE가 발생할 수 있습니다.

관련 문제