java.util.Objects.isNull против объекта == null


88

Как известно, java.util.Objectsэто

Этот класс состоит из статических служебных методов для работы с объектами.

Один из таких методов есть Objects.isNull().

Насколько я понимаю, Objects.isNull()это устранило бы шанс случайного присвоения объекту нулевого значения, пропустив второе =.

Однако в примечании к API говорится:

Этот метод существует для использования в качестве предиката, фильтра (Objects :: isNull)

Будет ли какая-либо причина / обстоятельство, по которым я должен использовать object == nullовер Objects.isNull()в выражении if ?

Следует Objects.isNull()ограничиваться исключительно предикатами?


3
Если все, что вас беспокоит, - это случайное назначение, вы можете просто использовать if(null == variable)последовательно…
Холгер

1
@ Холдер, о каком случайном назначении можно беспокоиться? Это Java. Вы получите ошибку типа.
Луи Вассерман,

1
@LouisWasserman Нет, если variableэто Boolean.
Alexis C.

2
@AlexisC, это было бы проблемой в крошечном, крошечном количестве случаев: ваша переменная должна быть очень определенного типа, и вы должны сделать очень конкретную опечатку, и вы не можете использовать какой-либо анализ IDE или компилятора это укажет вам на это (как и почти все IDE). Мне комфортно не беспокоиться об этом случае.
Луи Вассерман

1
На работе я видел много экземпляров объекта null == . Когда я спросил, мне сказали, что это сделано для предотвращения случайных присвоений null. Основываясь на приведенных здесь комментариях и ответах, я склонен полагать, что это дело вкуса.
Lucas T

Ответы:


79

следует использовать object == null вместо Objects.isNull () в инструкции if?

Если вы посмотрите на исходный код из 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 () это знание может быть потеряно для инструмента.
Стефан Херрманн

3
Есть небольшая разница в производительности. Проверка Java на предмет нулевой ссылки на объект по сравнению с вызовом статического метода будет иметь различие. И это читается немного менее ясно, чем просто использование ==, к которому мы все привыкли.
Kevin M

3
Есть более семантическое использование == nullв if, но IsNull велика для использования на лямбда - выражения.
Леонардо Рамос Дуарте

1
это конечно законно, но не имеет никаких преимуществ перед операторами. Поэтому, если вы работаете в команде, пожалуйста, используйте вещи по назначению.
Алекс Панченко

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он предназначен для Predicates, не мешает вам использовать его, как указано выше.


1
Что вы имеете в виду под риском опечатки?
Ашиш Лохия

2
@AshishLohia, используя =вместо ==(не будет компилироваться, если это не Booleanобертка, допускающая значение NULL , йо, честно)
Мена

5
Риск опечатки - это проблема C ++, а не Java, если (myObject = null) приведет к ошибке компиляции. Вы всегда должны использовать myObject == null вместо null == myObject.
Томас Марик

1
@TomasMarik, как упоминалось в моем комментарии, риск опечатки ограничен Booleanобертками с нулевым значением в Java. Это действительно довольно редко (и выдает предупреждения компилятора, когда присваивание nullпроверяется, как если бы это было условием), но не невозможно.
Mena

7

Будет ли какая-то причина / обстоятельство, по которым я должен использовать object == null вместо Objects.isNull () в инструкции if ?

Да, одна из причин - сделать код простым. Внутри if заявление object == null ясно и хорошо известно. Это не может привести к неправильному поведению, если, например, есть опечатка.

Насколько я понимаю, Objects.isNull () устранит вероятность случайного присвоения объекту нулевого значения, пропустив второй =.

Если параметр if (object = null) {}with пропущен, = он не будет компилироваться или выдаст предупреждение в случае Booleanобъекта! На самом деле нет причин использовать Objects.isNull(object)over object == nullвнутри оператора if . Вот два варианта бок о бок:

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)

Таким образом, если вы используете метод не как предикат, вы фактически используете более сложное и громоздкое выражение по сравнению с простым 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)) { 

}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.