우선 enum의 경우 둘 다 정확하고 옳습니다!! 팀 컨벤션을 따르길!

== 는 NullPointerException 을 절대 던지지 않는다
enum Color { BLACK, WHITE };
Color nothing = null;
if (nothing == Color.BLACK); // runs fine
if (nothing.equals(Color.BLACK)); // throws NullPointerException
==는 컴파일 타임에 type 검사를 합니다.
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!
요약하면 == .
- 두 개의 열거형 값을 비교하는 데 사용하는 == 것은 각 열거형 상수에 대해 하나의 개체만 있기 때문에 작동합니다. (싱글톤)
- 더 빠릅니다.
- 런타임에 더 안전.
- 컴파일 타임에 더 안전.

간단한 람다를 사용할 때는 메서드 참조를 사용할 수 있기 때문에 람다 equals보다 .== 를 선호합니다
다음 람다를 고려하십시오.
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e == SomeEnum.B);
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(e -> e.equals(SomeEnum.B));
나중에 다음으로 변환할 수 있습니다.
Stream.of(SomeEnum.A, SomeEnum.B).anyMatch(SomeEnum.B::equals));

그런데 반대의견들도 많네요.
== 대신 equals를 사용하는 것을 선호하는 이유?
참고로, 다음과 같이 작성하는 경우 null-safe 코드를 작성하는 데 실제로 사용할 필요가 없습니다
public useEnums(final SomeEnum a) {
if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
…
}
…
}
인식하지 못한 채 버그를 도입할 수 있기 때문입니다.
정확히 동일하지만 분리된 패키지에 있는 이 열거형이 있다고 가정합니다(일반적이지는 않지만 발생할 수 있음).
첫 번째 열거형 :
package first.pckg
public enum Category {
JAZZ,
ROCK,
POP,
POP_ROCK
}
두 번째 열거형:
package second.pckg
public enum Category {
JAZZ,
ROCK,
POP,
POP_ROCK
}
그런 다음 next와 같은 등호를 사용하지만 item.category인식 하지 못한 채
첫 번째 대신 first.pckg.Category 두 번째 second.pckg.Category enum( )을 가져왔다고 가정합니다.
import second.pckg.Category;
...
Category.JAZZ.equals(item.getCategory())
> 컴파일 오류 못잡아냄.
== 연산자를 대신 사용하면 컴파일 오류가 발생합니다.
import second.pckg.Category;
...
Category.JAZZ == item.getCategory()

또 다른 옵션은 유틸리티 방법입니다
Objects.equals( thisEnum , thatEnum )
Objects.equals널 안전을 위해
boolean areEqual = Objects.equals( Month.FEBRUARY , Month.JUNE ) ; // Returns `false`.
이 방법에는 몇 가지 이점이 있습니다.
- Null 안전
- 둘 다 null ➙true
- null ➙false
- NullPointerException 던질 위험이 없습니다
- 컴팩트, 가독성
작동 원리
OpenJDK 의 Java 10 소스 코드 에서 직접 확인하십시오 .
return
( a == b )
||
(
a != null
&&
a.equals( b )
)
;
== 먼저 체크하고, equal도 체크하는군용

'기술 정리 > 클린코드' 카테고리의 다른 글
Exception과 RuntimeException 차이? (0) | 2023.04.19 |
---|