Подтвердить что ты не робот

Java.util.Objects.isNull vs object == null

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

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

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

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

Тем не менее, примечание API гласит:

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

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

Должен ли Objects.isNull() быть ограничен исключительно предикатами?

4b9b3361

Ответ 1

должен использовать объект == 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;
 }

То же самое. Нет никакой разницы. Таким образом, вы можете безопасно использовать его.

Ответ 2

Objects.isNull предназначен для использования в лямбда-фильтрации Java 8.

Гораздо проще и понятнее написать:

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

чем написать:

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

Однако в утверждении if любой из них будет работать. Использование == null, вероятно, легче читать, но в конце концов оно сводится к предпочтениям стиля.

Ответ 3

Посмотрите на источник:

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

Ответ 4

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

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

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

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

if (object == null) {
}

if (Objects.isNull(object)) {
}

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

Можно сказать, что да, он ограничен исключительно Predicates, хотя нет технического препятствия для использования Objects.isNull() везде.

Из метода public static boolean isNull(Object obj) javadoc:

Метод @apiNoteThis существует для использования в качестве 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();