java.util.Objects.isNull 대 객체 == null


87

아시다시피 java.util.Objects입니다

이 클래스는 개체에서 작동하기위한 정적 유틸리티 메서드로 구성됩니다.

이러한 방법 중 하나는 Objects.isNull().

내 이해는 Objects.isNull()두 번째를 생략하여 실수로 null 값을 객체에 할당 할 가능성을 제거 한다는 것 =입니다.

그러나 API Note는 다음과 같이 설명합니다.

이 메서드는 조건 자, filter (Objects :: isNull)로 사용하기 위해 존재합니다.

내가 사용해야하는 어떤 이유 / 상황이있을 것 object == null이상 Objects.isNull()if 문 ?

Objects.isNull()술어에만 국한 되어야합니까 ?


3
당신이 걱정하는 모든 실수로 할당하는 경우, 당신은 단순히 사용할 수 있습니다 if(null == variable)... 일관
홀거

1
@Holder, 어떤 실수로 인한 할당에 대해 걱정해야합니까? 이것은 Java입니다. 유형 오류가 발생합니다.
Louis Wasserman

1
@LouisWasserman되지 않음 경우 variableA는 Boolean.
Alexis C.

2
@AlexisC, 즉 A의 문제가 될 것 작은, 작은 건수 : 당신의 변수가 매우 특정 유형이어야한다, 그리고 당신은 매우 구체적인 오타를 확인해야합니다, 그리고 당신이 어떤 IDE 또는 컴파일러 분석을 사용 할 수 없습니다 그것은 (거의 모든 IDE가 그렇듯이) 당신을 위해 지적 할 것입니다. 나는 그 사건에 대해 걱정하지 않는 것이 매우 편안합니다.
Louis Wasserman

1
직장에서 나는 많은 null == object 인스턴스를 보았습니다 . 제가 문의했을 때 우발적 인 null 할당을 방지하기위한 것이라고 들었습니다. 여기에 제공된 의견과 답변을 바탕으로 나는 그것이 맛의 교인이라고 믿는 경향이 있습니다.
루카스 T

답변:


79

if 문에서 Objects.isNull ()보다 object == null을 사용해야합니까?

당신이 보면 소스 코드IsNull방법,

 /* Returns true if the provided reference is null otherwise returns false.*/

 public static boolean isNull(Object obj) {
     return obj == null;
 }

동일합니다. 다른 점이 없다. 따라서 안전하게 사용할 수 있습니다.


14
예, 사용할 수 있지만 도구가 수행하는 로컬 흐름 분석을 방해 할 수 있습니다. 즉, 일반 "=="를 사용하면 모든 흐름 분석에서 then 브랜치에서는 역 참조가 좋지 않지만 else 브랜치에서는 안전하다는 것을 알 수 있습니다. 적절한 오류 / 경고가 표시되거나 아무것도 표시되지 않습니다. isNull ()을 간접적으로 호출하면 지식이 도구에 손실 될 수 있습니다.
Stephan Herrmann

3
약간의 성능 차이가 있습니다. 객체 null 참조에 대한 Java 검사와 정적 메서드 호출에는 차이가 있습니다. 그리고 우리 모두가 익숙한 ==를 사용하는 것보다 약간 덜 명확하게 읽습니다.
Kevin M

3
더 의미 사용인가 == null에는 if하지만, isNull에 람다 표현식에 사용하기 적합합니다.
Leonardo Ramos Duarte 2018

1
확실히 합법적이지만 운영자에게 어떤 이점도 없습니다. 따라서 팀으로 작업하는 경우 의도 한 목적에 따라 사용하십시오.
Alex Panchenko

74

Objects.isNull Java 8 람다 필터링 내에서 사용하기위한 것입니다.

작성하는 것이 훨씬 쉽고 명확합니다.

.stream().filter(Objects::isNull) 

쓰는 것보다 :

.stream().filter(x -> x == null).  

if그러나 성명 내 에서는 둘 다 작동합니다. 를 사용 == null하면 읽기가 더 쉬울 수 있지만 결국에는 선호하는 스타일로 귀결 될 것입니다.


12

출처를보십시오 :

public static boolean isNull(Object obj) {
    return obj == null;
}

null값 을 확인하려면 다음을 사용할 수 있습니다.

  • Objects.isNull(myObject)
  • null == myObject // avoids assigning by typo
  • myObject == null // risk of typo

사실 Objects.isNull에 대한 의미 Predicate의 위로 사용하지 못하도록하지 않습니다.


1
오타 위험이란 무엇을 의미합니까?
인 Ashish 가능해질

2
사용하여 @AshishLohia =대신은 ==(는 null 허용 않는 한 컴파일하지 않을 Boolean요 BE 박람회, 래퍼)
메나

5
오타의 위험은 (myObject = null) 컴파일 오류가 발생하는 경우 Java가 아닌 C ++의 문제입니다. 항상 myObject == null을 null == myObject보다 사용해야합니다.
Tomas Marik

1
내 의견에서 언급했듯이 @TomasMarik, 오타의 위험은 BooleanJava의 nullable 래퍼로 제한됩니다 . 이것은 실제로 매우 드물지만 (할당 null이 조건 인 것처럼 확인 될 때 컴파일러 경고를 표시 함) 불가능하지는 않습니다.
Mena

7

if 문 에서 Objects.isNull () 위에 object == null을 사용해야하는 이유 / 상황이 있습니까?

예, 한 가지 이유는 코드를 단순하게 유지하는 것입니다. 내 문이 경우 object == null 명확하고 잘 알려져있다. 예를 들어 오타가 있으면 오작동으로 이어질 수 없습니다.

내 이해는 Objects.isNull ()이 두 번째 =를 생략하여 실수로 객체에 null 값을 할당 할 가능성을 제거한다는 것입니다.

이 경우 if (object = null) {}생략 = 이 컴파일되지 않습니다거나 경우에 경고를 생성합니다 Boolean물체! 실제로 if 문 내에서 Objects.isNull(object)over 사용할 이유가 없습니다 . 다음은 두 가지 변형입니다.object == null

if (object == null) {
}

if (Objects.isNull(object)) {
}

Objects.isNull ()은 술어에만 한정되어야합니까?

예라고 말할 수 있습니다 Objects.isNull(). 모든 곳 에서 사용하는 데 기술적 장애물이 없지만 전적으로 술어에만 국한됩니다 .

로부터 public static boolean isNull(Object obj)메소드의 javadoc는 :

@apiNote이 메소드는 java.util.function.Predicate, filter (Objects :: isNull)로 사용하기 위해 존재합니다.

따라서이 메서드를 술어가 아닌 것으로 사용하면 실제로 간단한 .NET에 비해 더 복잡하고 성가신 표현식을 사용하는 것 object == null입니다.

다음은 이점을 비교하는 스 니펫입니다. Objects.isNull(object)

List<String> list = Arrays.asList("a", "b", null, "c", null);

// As ready-made predicate
long countNullsWithPredicate = list.stream().filter(Objects::isNull).count();

// Lambda
long countNullsWithLambda = list.stream().filter(object -> object == null).count();

// Reimplement the Objects::isNull predicate
long countNullsWithAnonymous = list.stream().filter(new Predicate<Object>() {
    @Override
    public boolean test(Object obj) {
        return obj == null;
    }
}).count();

1

의미 상 차이는 없지만 가독성을 위해 다음을 선호합니다 whatever == null.

import static java.util.Objects.isNull;

// Other stuff...

if(isNull(whatever)) { 

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.