(obj == null) против (null == obj)? - PullRequest
39 голосов
/ 30 июля 2011

Мой босс сказал, что я должен использовать null == obj, потому что это лучше, чем obj == null, но он не помнил, зачем это делать. Есть ли причина для использования null == obj?
Я чувствую это как-то ... наоборот!

После некоторого поиска в Google единственное, что я нашел:

в C, это предотвращает случайный ввод (obj = null) в условной структуре.

Ответы [ 6 ]

36 голосов
/ 30 июля 2011

Вы не можете случайно назначить null на obj, набрав вместо этого obj = null.Тем не менее, это воспоминание из C раз, в Java это невозможно, так как выражение = возвращает правую часть присваивания.Поскольку null не является boolean, компилятор будет жаловаться.

Я бы однажды попытался объяснить это своему боссу, продемонстрировать это.Если он все еще не согласен с тобой, просто сделай это.Бороться с твоим боссом мелочно.

18 голосов
/ 11 февраля 2015

Если вы скомпилируете свой файл с if(null==obj), сгенерированный байт-код будет if_acmpne, а в случае if(obj==null) это ifnonnull.Теперь в if_acmpne два операнда выталкиваются из стека и проверяются на то, что они не равны (в данном случае null и obj), а в ifnonnull только один операнд извлекается и проверяется, если он не равен нулю.Из этого кажется, что ifnonnull лучше, поскольку включает выталкивание только одного операнда.

Ссылки: http://www.artima.com/underthehood/flowP.html

11 голосов
/ 30 июля 2011

В Java нет разницы.

Я предпочитаю (obj == ноль), так как это кажется более естественным.

1 голос
/ 30 июля 2011

Если вы передадите условие как таковое if (obj=null) или if (null=obj) в современных Java IDE, оно будет выделено как синтаксическая ошибка. Кроме того, попытка компиляции будет сигнализировать об ошибке.

Оба (obj==null) и (null==obj) являются приемлемыми, они оба несут одинаковые накладные расходы, более поздние не дают никакой производительности вообще. Решение об использовании любого из них зависит от стиля кода, принятого для поддержания единого стиля в классах.

1 голос
/ 30 июля 2011

Я никогда не слышал об этом раньше, но кажется, что вы привели веские аргументы. Я также думаю, что он чувствует себя задом наперед, но у него не должно быть никаких проблем, кроме как «чувствовать» неправильно Я не думаю, что это будет иметь какие-либо преимущества в производительности или что-то подобное.

0 голосов
/ 06 ноября 2018

:)

Одна вещь, которую я нашел полезной в этом, заключается в том, что приведенный ниже синтаксис (абсолютно действительный из моего POV) не вызывает предупреждение spotbugs 'DC-DOUBLECHECK, позволяющее повысить порог spotbugs без каких-либо особых исключений и т. Д.

if (defaultClient == null) {
    synchronized (DEFAULT_CLIENT_INIT_LOCK) {
        if (null == defaultClient) {
            ...
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...