Java 열거 형 멤버 비교 : == 또는 equals ()?


1736

Java 열거 형은 개인 생성자와 많은 공개 정적 멤버가있는 클래스로 컴파일된다는 것을 알고 있습니다. 주어진 열거 형의 두 멤버를 비교할 때 항상 사용했습니다 .equals().

public useEnums(SomeEnum a)
{
    if(a.equals(SomeEnum.SOME_ENUM_VALUE))
    {
        ...
    }
    ...
}

그러나 방금 ==.equals () 대신 equals 연산자를 사용하는 코드를 발견했습니다 .

public useEnums2(SomeEnum a)
{
    if(a == SomeEnum.SOME_ENUM_VALUE)
    {
        ...
    }
    ...
}

어떤 연산자를 사용해야합니까?


7
방금 비슷한 질문
Matt Ball

39
모든 대답 (특히 == 작동 이유를 자세히 설명하는 polygenelubricants의 답변)에서 ==의 또 다른 큰 이점은 언급되지 않았다는 사실에 놀랐습니다. 사물). equals를 사용하면 같은 열거 형 '대체'의 인스턴스가 여러 개있을 수 있다고 생각하게됩니다.
스튜어트 Rossiter

6
간단하게 유지하십시오. "=="는 더 읽기 쉽고 열거 형이 기본적으로 싱글 톤이기 때문에 작동합니다. Ref
lokesh

답변:


1575

둘 다 기술적으로 정확합니다. 에 대한 소스 코드를 살펴보면 .equals()간단히 연기됩니다 ==.

내가 사용 ==하는이 null 안전 할 것 같은, 그러나.


64
개인적으로, 나는 ==를 사용하는 이유로 언급 된 '널 안전'을 좋아하지 않습니다.
니 바스

257
@ 니 바스 : 왜 안돼? 논증의 순서에 대해 걱정하고 싶습니까 (파스칼의 대답 에서처럼 왼쪽에서 상수를 비교하는 경우에만 해당)? 값을 입력하기 전에 항상 null이 아닌지 확인 .equals()하고 싶습니까? 나는 그렇지 않다는 것을 안다.
매트 볼

86
코드를 읽을 때 "=="는 사용자가 출발하여 관련된 유형의 소스를 찾은 다음 열거 형을 볼 때까지 독자에게 잘못 표시 될 수 있습니다. 그런 의미에서 ".equals ()"를 읽는 것이 방해가되지 않습니다.
Kevin Bourrillion

60
@Kevin-소스를 볼 때 직접 유형을 볼 수있는 IDE를 사용하지 않으면 적절한 IDE의 문제가 아니라 속임수입니다.
MetroidFan2002

63
때로는 코드가 리팩토링되고 열거 형이 클래스로 대체 될 수 있습니다.이 시점에서 ==는 더 이상 정확한 것으로 보장되지 않지만 equals는 계속 원활하게 작동합니다. 이러한 이유로 동등이 더 나은 선택입니다. null 안전을 원한다면 (null 사용을 최소화하기 위해 작성되지 않은 코드베이스에서 작업하기 때문에) Apache ObjectUtils 또는 Guava의 Objects # equal이 있거나 자신의 롤을 할 수 있습니다. 나는 누군가가 도널드 크 누스 책으로 정당하게 나를 때리고 있다는 두려움에 대해 "성능"이라는 단어를 언급하지 않을 것입니다.
laszlok

1113

==에 사용 enum?

예 : 열거 형에는 인스턴스 ==를 비교하는 데 사용할 수있는 엄격한 인스턴스 컨트롤이 있습니다 . 언어 사양에서 제공하는 보증은 다음과 같습니다 (강조 표시).

JLS 8.9 열거 형

열거 형에는 열거 형 상수로 정의 된 인스턴스 이외의 인스턴스가 없습니다.

열거 형 유형을 명시 적으로 인스턴스화하려고 시도하면 컴파일 타임 오류입니다. 이 final clone방법을 사용 Enum하면 enum상수를 복제 할 수 없으며 직렬화 메커니즘에 의한 특수 처리를 통해 역 직렬화의 결과로 중복 인스턴스가 작성되지 않습니다. 열거 형 유형의 반사 인스턴스화는 금지됩니다. 이 네 가지를 함께 사용 enum하면 enum상수에 의해 정의 된 것 이상의 유형 인스턴스가 존재하지 않습니다 .

enum상수에는 하나의 인스턴스 만 있기 때문에 두 개 객체 참조 중 하나 이상이 상수 를 나타내는 것으로 알려진 경우 두 객체 참조를 비교할 때 메소드 대신 연산자 를 사용할 수==equalsenum 있습니다. (의 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는 다음과 같습니다.

  • 효과가있다.
  • 더 빠릅니다.
  • 런타임에 더 안전합니다.
  • 컴파일 타임에 더 안전합니다.

27
좋은 대답이지만 ... 1. 작동합니다 : 동의합니다 2. 더 빠릅니다 : 열거 형을 위해 그것을 증명하십시오 :) 3. 런타임에 더 안전합니다 : Color nothing = null;IMHO는 버그이며 수정해야합니다. ) 4. 톰 Hawtin의의 의견을 참조 그것은 컴파일시 더 안전 확인 :하지만 equals여전히 반환합니다 false. 결국, 나는 그것을 사지 않고 equals()가독성을 선호 합니다 (Kevin의 의견 참조).
Pascal Thivent

201
어떤 사람들 foo.equals(bar)은 그보다 더 읽기 쉽다고 생각하는 것은 자바에 대한 블랙 마크입니다foo == bar
Bennett McElwee

19
작동 : 리팩토링의 일부로 열거 형을 클래스로 교체해야 할 때까지. == 사용하여 모든 코드를 찾는 것이 좋습니다. 더 빠릅니다 : 사실이지만 (물론) Knuth는 조기 최적화에 대해 인용합니다. 런타임시 더 안전 : "= 안전"이 NullPointerException에서 당신을 분리시키는 유일한 방법이라면 "안전"은 처음 떠오르는 단어가 아닙니다. 컴파일 타임에 더 안전합니다 : 실제로는 아닙니다. 그것은 틀린 타입을 비교하는 다소 기본적인 실수로부터 당신을 보호 할 수 있지만, 다시 말하지만, 그것이 프로그래머가 바보 같은 경우라면 "안전"이 당신이 아닌 것입니다.
laszlok

35
"그래서 프로그래머가 멍청하다면"안전하다 "는 것이 아닙니다." -나는이 인용에 동의하지 않습니다. 이것은 타입 검사의 핵심입니다. 컴파일 타임에 코드를 실행하기 전에 "멍청한"실수를 방지합니다. 똑똑한 사람들조차도 멍청한 실수를 저지르고 약속보다 보증을 더 잘합니다.
ymajoros

7
@laszlok : 물론, 일이 실패 할 수 있다면 그들은 그럴 것입니다. 멍청한 실수에 대한 울타리를 갖는 것은 항상 좋은 일입니다. 사소한 버그를 줄이기 위해 창의력을 발휘할 여지가 충분합니다. 코드를 실행하기 전에 컴파일러가이를 처리하도록하십시오.
ymajoros 2014

88

사용 == 각 열거 형 정수에 대해 하나의 객체가 있기 때문에,이 개 열거 값 작품을 비교.

참고로, ==다음 equals()과 같이 작성하면 실제로 널 안전 코드를 작성하는 데 사용할 필요가 없습니다 .

public useEnums(final SomeEnum a) {
    if (SomeEnum.SOME_ENUM_VALUE.equals(a)) {
        
    }
    
}

이것은 반드시 왼쪽에서 상수 비교로 알려진 모범 사례 입니다.


9
.equals()문자열 값을 입력 할 때이 작업을 수행 하지만 여전히 null 안전 코드를 작성하는 방법은 엉터리라고 생각합니다. 나는 오히려 연산자 (또는 메소드를 가지고 있지만 도트 연산자가 작동하는 방식 때문에 Java에서 [null object] .equals는 null 안전하지 않음)를 알고 있지만 의미 적으로, "같음"연산자는 항상 출퇴근 해야 합니다.
매트 볼

2
Java에는 Groovy ( ?.) 의 Safe Navigation 연산자가 없으므로 상수와 비교할 때이 연습을 계속 사용하고 TBH는 엉뚱하지 않으며 아마도 "자연스럽지 않습니다".
Pascal Thivent

32
null열거는 일반적으로 오류가 발생합니다. 가능한 모든 값을 열거했으며 여기에 다른 값이 있습니다!
Tom Hawtin-tackline

8
으로 명시 적으로 주석이 달린 값을 제외하고 왼쪽 에서 상수 비교를 반 패턴으로 @Nullable간주 합니다. 열거 형은 거의 없어야 하므로 null 값은 프로그래밍 오류가됩니다. 이러한 경우 NPE를 빨리 던질수록 Null을 허용 한 위치에서 프로그래밍 실수를 발견 할 가능성이 높아집니다. 따라서 열거 형 유형과 관련하여 "모범 사례 ... 반드시 따라야합니다"는 잘못되었습니다. @Nullable
Tobias

24
왼쪽에서 상수 비교 요다 스타일의 최고의 영어와 같은 모범 사례입니다.
maaartinus

58

다른 사람이 말했듯이, 모두 ==.equals() 대부분의 경우에 작동합니다. 다른 사람들이 지적한 완전히 다른 유형의 객체를 비교하지 않는 컴파일 시간 확실성은 유효하고 유익하지만 FindBugs는 두 가지 다른 컴파일 시간 유형의 객체를 비교하는 특정 버그도 발견 할 수 있습니다 Eclipse / IntelliJ 컴파일 시간 검사)) Java 컴파일러는 안전성을 크게 추가하지 않습니다.

하나:

  1. ==내 마음 속에 NPE 를 절대 던지지 않는다는 사실 은 단점 이다 ==. 를 통해 표현하려는 추가 상태를 추가 인스턴스로 추가 할 수 있기 때문에 enum유형이 될 필요는 거의 없습니다 . 예상치 못한 경우 조용히 거짓으로 평가하는 것보다 NPE가 필요합니다 . 따라서 나는 그것이 런타임 의견에 더 안전하다는 것에 동의하지 않는다 . 값을 절대로 두지 않는 습관을들이는 것이 좋습니다.nullnullenumnull==enum@Nullable
  2. 인수 ==입니다 빨리는 또한 가짜입니다. 대부분의 경우 .equals()컴파일 시간 유형이 enum 클래스 인 변수를 호출 하며,이 경우 컴파일러는 ==( enum' equals()메소드를 재정의 할 수 없기 때문에) 와 동일하다는 것을 알고 함수 호출을 최적화 할 수 있습니다 떨어져. 컴파일러가 현재이 작업을 수행하고 있는지 확실하지 않지만 그렇지 않은 경우 Java의 전반적인 성능 문제로 판명되면 10 만 명의 Java 프로그래머가 프로그래밍 스타일을 변경하도록 프로그래밍하는 것보다 컴파일러를 수정하는 것이 좋습니다 특정 컴파일러 버전의 성능 특성
  3. enums객체입니다. 다른 모든 객체 유형의 경우 표준 비교는 .equals()아닙니다 ==. 예외 enums==아닌 객체를 비 대신 클래스로 equals()리팩토링하는 경우 실수 대신 객체를 대신 비교할 수 있기 때문에 예외를 만드는 것이 위험하다고 생각합니다 enum. 이러한 리팩토링의 경우, 위의 작동 지점이 잘못되었습니다. ==올바른 사용법을 확신하려면 문제의 가치 enum가 기본인지 또는 기본 인지 확인해야합니다 . enum클래스 가 아닌 경우 코드가 여전히 컴파일되기 때문에 잘못되었지만 쉽게 놓칠 수 있습니다. 사용하는 유일한 경우.equals()문제의 가치가 원시적이라면 틀릴 것이다. 이 경우 코드가 컴파일되지 않으므로 놓치기가 훨씬 어렵습니다. 따라서 .equals()올바른 것으로 식별하기가 훨씬 쉽고 향후 리팩토링에 대해 더 안전합니다.

실제로 Java 언어는 왼쪽 값에서 .equals ()를 호출하기 위해 Objects에 ==을 정의하고 객체 ID에 대해 별도의 연산자를 도입해야한다고 생각하지만 Java가 정의 된 방식은 아닙니다.

요약하자면, 나는 여전히 논쟁이 유형 에 사용 .equals()하는 것을 선호한다고 생각합니다 enum.


4
글쎄, 포인트 3에 대해, 나는 목표 enum로 사용할 수 switch있으므로 조금 특별합니다. Strings도 조금 특별합니다.
CurtainDog

switch 문의 구문에는 == 또는 .equals ()가 포함되어 있지 않으므로 요점이 무엇인지 알 수 없습니다. 필자의 요점은 독자가 코드를 확인하는 것이 얼마나 쉬운 지에 관한 것이다. switch 문이 컴파일되는 한 switch 문의 동일성 의미는 정확합니다.
Tobias

17

나는 ==대신에 사용하는 것을 선호합니다 equals:

다른 이유는 여기에서 이미 논의한 다른 것들 외에도 버그를 깨닫지 않고 버그를 도입 할 수 있기 때문입니다. 정확히 같지만 분리 된 pacakges에있는이 열거 형이 있다고 가정합니다 (일반적이지는 않지만 발생할 수 있음).

첫 번째 열거 형 :

package first.pckg

public enum Category {
    JAZZ,
    ROCK,
    POP,
    POP_ROCK
}

두 번째 열거 형 :

package second.pckg

public enum Category {
    JAZZ,
    ROCK,
    POP,
    POP_ROCK
}

그런 다음에 다음과 같이 등호를 사용하는 가정 item.category이다 first.pckg.Category그러나 당신은 두 번째 열거 (수입 second.pckg.Category그것을 실현하지 않고 첫 번째 대신) :

import second.pckg.Category;
...

Category.JAZZ.equals(item.getCategory())

당신은에 allways를 얻을 것이다 그래서 false당신은 진정한 때문에 예상하지만 다른 열거입니다 때문 item.getCategory()입니다 JAZZ. 그리고보기 어려울 수 있습니다.

따라서 대신 연산자 ==를 사용하면 컴파일 오류가 발생합니다.

operator ==는 "second.pckg.Category", "first.pckg.Category"에 적용 할 수 없습니다

import second.pckg.Category; 
...

Category.JAZZ == item.getCategory() 

당신이 언급 한 아주 좋은 점. 그래서 내가 할 일은 myenum.value ()를 적용하고 NPE 안전을 위해 == 비교를 수행하는 것입니다.
자바 메인

14

다음은 두 가지를 비교하기위한 조잡한 타이밍 테스트입니다.

import java.util.Date;

public class EnumCompareSpeedTest {

    static enum TestEnum {ONE, TWO, THREE }

    public static void main(String [] args) {

        Date before = new Date();
        int c = 0;

        for(int y=0;y<5;++y) {
            for(int x=0;x<Integer.MAX_VALUE;++x) {
                if(TestEnum.ONE.equals(TestEnum.TWO)) {++c;}
                if(TestEnum.ONE == TestEnum.TWO){++c;}              
            }
        }

        System.out.println(new Date().getTime() - before.getTime());
    }   

}

IF를 한 번에 하나씩 주석 처리하십시오. 디스 어셈블 된 바이트 코드에서 위의 두 가지 비교는 다음과 같습니다.

 21  getstatic EnumCompareSpeedTest$TestEnum.ONE : EnumCompareSpeedTest.TestEnum [19]
 24  getstatic EnumCompareSpeedTest$TestEnum.TWO : EnumCompareSpeedTest.TestEnum [25]
 27  invokevirtual EnumCompareSpeedTest$TestEnum.equals(java.lang.Object) : boolean [28]
 30  ifeq 36

 36  getstatic EnumCompareSpeedTest$TestEnum.ONE : EnumCompareSpeedTest.TestEnum [19]
 39  getstatic EnumCompareSpeedTest$TestEnum.TWO : EnumCompareSpeedTest.TestEnum [25]
 42  if_acmpne 48

첫 번째 (동일)는 가상 호출을 수행하고 스택에서 리턴 부울을 테스트합니다. 두 번째 (==)는 스택에서 직접 객체 주소를 비교합니다. 첫 번째 경우에는 더 많은 활동이 있습니다.

한 번에 하나씩 두 IF로이 테스트를 여러 번 실행했습니다. "=="이 너무 빠릅니다.


컴파일러 분기 예측으로 인해이 테스트가 유효하지 않을 수 있습니다. 똑똑한 컴파일러는 if 문이 항상 false로 평가되어 다중 비교를 피한다는 것을 인식합니다. 정말 똑똑한 컴파일러는 y 및 x 루프의 값이 결과에 영향을 미치지 않으며 전체를 최적화하지 못한다는 것을 인식 할 수도 있습니다.
Darrel Hoffman

가능하지만 그렇지 않습니다. 내 답변에 실제 컴파일러 생성 바이트 코드를 보여줍니다.
ChrisCantrell

둘 다 혼란 스럽습니다. :-) 분기 예측은 런타임에 작동하므로 다른 바이트 코드는 서로 관련이 없습니다. 그러나이 경우 분기 예측은 경우 모두 동일하게 도움이 됩니다.
vidstige

7
무슨 상관이야? 비디오 게임 도중 루프 내에서 열거 형을 수천 번 비교하지 않는 한 여분의 나노초는 의미가 없습니다.
user949300

바이트 코드는 해석 모드를 강제하지 않는 한 성능과 관련이 없습니다. JMH 벤치 마크를 작성 하여 성능이 정확히 동일한 지 확인하십시오.
maaartinus


7

tl; dr

또 다른 옵션은 Objects.equals유틸리티 방법입니다.

Objects.equals( thisEnum , thatEnum )

Objects.equals 안전을 위해

.equals () 대신 operator ==와 같습니다.

어떤 연산자를 사용해야합니까?

세 번째 옵션은 Java 7 이상에 추가 된 유틸리티 클래스 equals에 있는 정적 메소드 입니다.Objects

다음은 Month열거 형을 사용하는 예 입니다.

boolean areEqual = Objects.equals( Month.FEBRUARY , Month.JUNE ) ;  // Returns `false`.

혜택

이 방법에는 몇 가지 이점이 있습니다.

  • 널 안전
  • 작고 읽기 쉬운

작동 원리

사용되는 논리는 무엇입니까 Objects.equals?

으로부터, 자신에 대한 참조 자바 (10) 소스 코드오픈 JDK :

return (a == b) || (a != null && a.equals(b));

6

==열거 상수를 비교하는 것 이외의 다른 것을 사용하는 것은 말이되지 않습니다. 객체를 비교하는classequals 것과 같습니다 –하지 마십시오!

그러나 Sun JDK 6u10 및 이전 버전 에는 불쾌한 버그 ( BugId 6277781 )가있어 역사적 이유로 흥미로울 수 있습니다. 이 버그 ==는 역 직렬화 된 열거 형 의 적절한 사용을 막았습니다 .


4

열거 형은 public static final field(불변)에 의해 선언 된 각 열거 상수에 대해 단일 인스턴스와 같은 하나의 인스턴스를 반환하는 클래스 이므로 ==연산자를 사용하여 equals()메소드를 사용하지 않고 동등성을 확인할 수 있습니다


1

열거 형이 ==와 함께 쉽게 작동하는 이유는 정의 된 각 인스턴스도 싱글 톤이기 때문입니다. 따라서 ==를 사용하는 ID 비교는 항상 작동합니다.

그러나 == 사용하면 열거 형과 함께 작동하므로 모든 코드가 해당 열거 형의 사용법과 밀접하게 결합되어 있습니다.

예를 들어 : 열거 형은 인터페이스를 구현할 수 있습니다. 현재 Interface1을 구현하는 열거 형을 사용한다고 가정하십시오. 나중에 누군가가 변경하거나 동일한 인터페이스의 구현으로 새로운 클래스 Impl1을 소개합니다. 그런 다음 Impl1 인스턴스를 사용하기 시작하면 이전의 == 사용으로 인해 변경 및 테스트 할 코드가 많이 있습니다.

따라서 정당한 이익이 없다면 좋은 방법으로 간주되는 것을 따르는 것이 가장 좋습니다.


좋은 대답이지만 이미 언급 했습니다 .
shmosel

음 그 시점에서 인터페이스에서 == 또는 equals를 사용할지 여부에 대한 질문이 있습니다. 또한 불변 유형의 구현을 변경 가능한 구현으로 대체하는 것이 현명한 지에 대한 모든 종류의 질문. 그리고 정당한 이득에 대해 걱정하기 전에 모범 사례가 무엇인지 알아내는 것이 현명 할 것입니다. (imho ==가 더 좋습니다).
Robin Davies

1

소나 규칙 중 하나는 Enum values should be compared with "=="입니다. 그 이유는 다음과 같습니다.

equals()열거 형이 Object이고 모든 Java 개발자가 ==Object의 내용을 비교하는 데 사용해서는 안된다는 것을 알고 있기 때문에 열거 형 값의 동등성을 테스트하는 것은 완벽하게 유효합니다 . 동시에 ==열거 형을 사용하여 :

  • 동일한 예상 비교 (콘텐츠)를 제공합니다 equals()

  • 보다 안전하다 equals()

  • 런타임 검사가 아닌 컴파일 타임 (정적) 검사 제공

이러한 이유로을 사용하는 ==것이을 선호합니다 equals().

마지막으로 ==on 열거 형은보다 읽기 쉽습니다 (더 자세한 정보는 아니지만 ) equals().


0

요컨대, 장단점이 있습니다.

한편으로는 사용하는 이점이 있습니다 == 으로는 다른 답변에서 설명한 것처럼 .

반면에 어떤 이유로 든 열거 형을 다른 접근법 (일반 클래스 인스턴스)으로 ==바꾸면 물린 것을 사용 합니다. (BTDT.)


-1

polygenelubricants의 답변을 보완하고 싶습니다.

개인적으로 equals ()를 선호합니다. 그러나 유형 호환성 검사가 중단됩니다. 중요한 제한이라고 생각합니다.

컴파일 타임에 형식 호환성을 확인하려면 열거 형에서 사용자 정의 함수를 선언하고 사용하십시오.

public boolean isEquals(enumVariable) // compare constant from left
public static boolean areEqual(enumVariable, enumVariable2) // compare two variable

이를 통해 NPE 보호, 읽기 쉬운 코드 및 컴파일시 유형 호환성 확인이라는 두 가지 솔루션을 모두 활용할 수 있습니다.

또한 enum에 UNDEFINED 값을 추가하는 것이 좋습니다.


4
이 솔루션이 왜 더 나은 ==가요? 으로 ==당신이 읽기 쉬운 코드 및 컴파일 시간 유형 호환성 검사 NPE 보호를 얻는다면, 당신은 그 모두를 얻을 사용자 정의가 동일-같은 방법 작성하지 않고.
Matt Ball

1
UNDEFINED값은 아마 좋은 생각이다. 물론 Java 8에서는 Optional대신 사용합니다 .
Tomas

-7

==NullPointerException기본 유형이 클래스 버전과 비교되는 경우 던질 수 있습니다 . 예를 들면 다음과 같습니다.

private static Integer getInteger() {
    return null;
}

private static void foo() {
    int a = 10;

    // Following comparison throws a NPE, it calls equals() on the 
    // non-primitive integer which is itself null. 
    if(a == getInteger()) { 
        // Some code
    }
}

2
이 질문의 범위는 다소 명확하며 기본 유형은 범위에 없습니다.
Tom

@Tom 여기서 진행되는 토론 ==은 결코 던져 질 수없는 오해의 소지가 있습니다 NPEs. 이 질문에는 충분한 답변이 있지만 버그 / 기능에 2 시간이 걸리는 나와 같은 누군가가 이것을 읽는 경우에 좋은 참고 자료가 될 수 있습니다.
ayushgp

1
이 질문의 주제를 무시하지 않으면 NPE를 던질 수 없습니다. 이 답변을 여기에 보관하더라도 다른 문제를 검색하여이 답변을 찾은 것과 같은 문제가있는 사람이 있다고 생각하십니까? 그 사람은 분명히 사용하지 않는 열거 형을 검색해야합니다. 이 답변은 this question에 더 합리적입니다. stackoverflow.com/questions/7520432/…
Tom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.