2010-06-03 5 views
33

나는 방법 equals(Object x)Enumfinal로 정의되어 있기 때문에 다음 코드 ...자바가 열거 형에서 equals (Object)를 재정의 할 수없는 이유는 무엇입니까?

@Override 
public boolean equals(Object otherObject) { 
    ... 
} 

가 ... 열거 허용되지 않는 것으로 나타났습니다. 이게 왜 그렇게?

Enum에 대해 equals(Object)을 재정의해야하는 사용 사례는 생각할 수 없습니다. 나는 단지이 행동의 추론을 알고 싶어한다.

답변

33

return this == other을 제외한 모든 항목은 직관력이 없으며 the principle of least astonishment을 위반합니다. 두 개의 enum 상수는 동일한 객체이고이 동작을 재정의하는 기능이 오류가 발생하기 쉬운 경우에만 equal이 될 것으로 예상됩니다.

같은 이유는 hashCode(), clone(), compareTo(Object), name(), ordinal()getDeclaringClass()에 적용됩니다. JLS가 최종 만들기의 선택 동기를 부여하지만, 언급하지 않지만


열거 here의 맥락에서 동일합니다. 니펫

(가) Enum의 방법에 해당하는 것은 단순히 따라서 신원 비교를 수행 인수에 super.equals를 호출하고 결과를 반환하는 마지막 방법이다.

0

자바 디자이너가 Enum.equals (Object)를 재정의하여 생각할 수 없기 때문에 정확하게 재정의 할 수 있습니다. 따라서 해당 재정의가 불가능할 수 있습니다.

3

enum의 인스턴스 (값)가 동일하다는 것이 의미하는 바를 이미 직관적으로 제공합니다. 오버로드를 허용하면 equals 메소드가 위반되어 예상치 못한 동작, 버그 등이 발생할 수 있습니다.

0

나는 자바 열거 비교 ==을 장려한다는 것이다 나는 이유 equals()이 열거 형의 마지막이라고 생각합니다. 열거 내가에 equals()를 오버라이드 (override) 할 것이다 마지막 일이다

을 고백하고, equals()의 구현해야한다 열거 형에서 단순히 사용하므로 equals()을 재정의하는 것은 ==equals()이 다르게 동작하는 것을 방지하는 것입니다. 이는 다른 개발자가 기대하지 않는 것입니다.

관련 문제