java.util.Objects.isNull проти object == null


88

Як відомо, java.util.Objectsє

Цей клас складається із статичних корисних методів для роботи з об’єктами.

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

Я розумію, що Objects.isNull()це усуне ймовірність випадкового присвоєння нульового значення об’єкту, опустивши друге =.

Однак у примітці API зазначено:

Цей метод існує для використання в якості предиката, фільтра (Objects :: isNull)

Чи буде якийсь - небудь причини / обставини , для яких я повинен використовувати object == nullбільш Objects.isNull()в , якщо заяву ?

Чи Objects.isNull()слід обмежуватися виключно предикатами?


3
Якщо все, що вас турбує, це випадкове призначення, ви можете просто використовувати if(null == variable)послідовно ...
Холгер

1
@Holder, яке випадкове призначення має турбуватися? Це Java. Ви отримаєте помилку типу.
Луїс Вассерман

1
@LouisWasserman Ні, якщо variableє Boolean.
Alexis C.

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

1
На роботі я бачив багато екземплярів null == object . Коли я запитав, мені сказали, що це для запобігання випадковим нульовим призначенням. Спираючись на надані тут коментарі та відповіді, я схильний вважати, що це матерія смаку.
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
Так, його можна використовувати, але це може заважати аналізу місцевого потоку, який виконується інструментом. Тобто, з простим "==", будь-який аналіз потоку може побачити, що відмінювання не є хорошим у тодішній гілці, але безпечним для іншої гілки. Ви отримаєте відповідні помилки / попередження чи нічого. З непрямим викликом isNull (), знання можуть бути втрачені інструментом.
Stephan Herrmann

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
Що ви маєте на увазі під ризиком друкарської помилки?
Ashish Lohia

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

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

1
@TomasMarik, як згадувалось у моєму коментарі, ризик друкарської помилки обмежений обнулювальними Booleanобгортками на Java. Це насправді досить рідко (і дасть попередження компілятору, коли призначення призначено для nullперевірки, ніби це умова), але не неможливо.
Мена

7

Чи існують які-небудь причини / обставини, з яких я повинен використовувати object == null над Objects.isNull () в операторі if ?

Так, одна з причин - простота коду. У разі затвердження object == null ясно і добре відомі. Це не може призвести до будь-якої неналежної поведінки, якщо, наприклад, існує помилка.

Я розумію, що Objects.isNull () усуне ймовірність випадкового присвоєння об'єкту нульового значення, опустивши друге =.

Якщо є параметр if (object = null) {}з пропущеним, = він не компілюється, або генерує попередження у випадку Booleanоб'єкта! Насправді немає жодної причини для використання Objects.isNull(object)над 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.