Java.util.Objects.isNull vs object == null
Как вы знаете, java.util.Objects
это
Этот класс состоит из статических служебных методов для работы с объектами.
Одним из таких методов является Objects.isNull()
.
Насколько я понимаю, Objects.isNull()
исключит возможность случайного присвоения объекту нулевого значения, пропустив второе =
.
Тем не менее, примечание API гласит:
Этот метод существует для использования в качестве предиката, фильтра (Objects :: isNull)
Будут ли какие-либо причины/обстоятельства, по которым мне следует использовать object == null
вместо Objects.isNull()
в выражении if?
Должен ли Objects.isNull()
быть ограничен исключительно предикатами?
Ответы
Ответ 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();