수 ==
에 사용 enum
?
예 : 열거 형에는 인스턴스 ==
를 비교하는 데 사용할 수있는 엄격한 인스턴스 컨트롤이 있습니다 . 언어 사양에서 제공하는 보증은 다음과 같습니다 (강조 표시).
열거 형에는 열거 형 상수로 정의 된 인스턴스 이외의 인스턴스가 없습니다.
열거 형 유형을 명시 적으로 인스턴스화하려고 시도하면 컴파일 타임 오류입니다. 이 final clone
방법을 사용 Enum
하면 enum
상수를 복제 할 수 없으며 직렬화 메커니즘에 의한 특수 처리를 통해 역 직렬화의 결과로 중복 인스턴스가 작성되지 않습니다. 열거 형 유형의 반사 인스턴스화는 금지됩니다. 이 네 가지를 함께 사용 enum
하면 enum
상수에 의해 정의 된 것 이상의 유형 인스턴스가 존재하지 않습니다 .
각 enum
상수에는 하나의 인스턴스 만 있기 때문에 두 개 객체 참조 중 하나 이상이 상수 를 나타내는 것으로 알려진 경우 두 객체 참조를 비교할 때 메소드 대신 연산자 를 사용할 수==
equals
enum
있습니다. (의 equals
방법Enum
A는 final
그것이 단지 호출 방법에 super.equals
따라서 식별 비교를 수행하는 인수 및 리턴 결과에).
이 보장은 Josh Bloch가 권장하는 것보다 강력합니다. 싱글 톤 패턴 사용을 고집하는 경우이를 구현하는 가장 좋은 방법은 단일 요소를 사용하는 것입니다 enum
( 유효한 Java 2 판, 항목 3 : 개인 생성자 또는 열거 형 ; Singleton의 스레드 안전성 )
의 차이점은 무엇입니까 ==
와는 equals
?
다시 말해, 일반적으로에 ==
대한 실행 가능한 대안이 아니라고 말해야합니다 equals
. 그러나 (와 같은 경우 enum
) 고려해야 할 두 가지 중요한 차이점이 있습니다.
==
절대 던지지 NullPointerException
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==
컴파일 타임에 형식 호환성 검사 대상
enum Color { BLACK, WHITE };
enum Chiral { LEFT, RIGHT };
if (Color.BLACK.equals(Chiral.LEFT)); // compiles fine
if (Color.BLACK == Chiral.LEFT); // DOESN'T COMPILE!!! Incompatible types!
==
해당되는 경우 사용해야합니까 ?
Bloch는 인스턴스를 적절히 제어 할 수있는 불변 클래스 ==
가 사용 가능한 클라이언트를 보장 할 수 있다고 구체적으로 언급합니다 . enum
구체적으로 예시 적으로 언급된다.
항목 1 : 생성자 대신 정적 팩토리 메소드 고려
[...] 그것은 불변 클래스가 두 개의 동일한 인스턴스가 존재하지 않도록 보장합니다 : a.equals(b)
if and only if a==b
. 클래스가이 보증을하면 클라이언트는 ==
대신에 연산자를 사용할 수 있습니다 .equals(Object)
메소드 성능을 향상시킬 수 있습니다. 열거 형은이 보증을 제공합니다.
==
on 을 사용하기위한 인수 enum
는 다음과 같습니다.
- 효과가있다.
- 더 빠릅니다.
- 런타임에 더 안전합니다.
- 컴파일 타임에 더 안전합니다.