Я слышал от кого-то, что null == object
лучше, чем object == null
проверить
например:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
Есть ли причины или это очередной миф? Спасибо за помощь.
null
справок курс действий по умолчанию должен заключаться в выдаче NPE. В некоторых хороших библиотеках (например, в Java-библиотеке JDK7) есть метод вродеpublic static <T> T notNull(T obj) { if (obj == null) { throw new NullPointerException(); } else { return obj; } }
. Также есть@NonNull
(или@Nonnull
?), Но это «стирается».null == object
известен как состояние Йоды .Ответы:
Вероятно, это привычка, полученная от C, чтобы избежать такой опечатки (одиночной
=
вместо двойной==
):Соглашение о помещении константы в левой части
==
не очень полезно в Java, поскольку Java требует, чтобы выражение вif
оценке оценивалось какboolean
значение, поэтому, если константа не является aboolean
, вы получите ошибку компиляции в любом случае, если вы поместите аргументы. (и если это логическое значение, вам==
все равно не следует использовать ...)источник
x.booleanValue()
или!x.booleanValue()
.x == true
илиx == false
в выражении состояния - это неприятный запах, ИМХО.null == object
только для того, чтобы убедиться, что мы случайно не перезаписываем объект с опечаткой, вообще не должно быть прецедентом. Это означает, что мы обучаем себя тому, что теперь, когда я сначала использую «null», все в порядке, даже если я сделаю ошибку. Это не означает, что код работает должным образом. Даже еслиnull = object
указано вместоnull == object
, программа не будет работать должным образом! Тогда нет смысла следовать этому условию!Как говорили другие, это привычка, которую выучили у C, избегать опечаток - хотя даже в C я ожидал бы, что достойные компиляторы при достаточно высоких уровнях предупреждений выдадут предупреждение. Как говорит Чандру, сравнение с null в Java таким способом вызовет проблемы только в том случае, если вы используете переменную типа
Boolean
(которой нет в примере кода). Я бы сказал, что это довольно редкая ситуация, и не та, для которой стоит менять способ написания кода в любом другом месте. (Я бы не стал обращать внимание на операнды даже в этом случае; если я достаточно ясно мыслю, чтобы рассмотреть возможность их изменения, я уверен, что могу посчитать знаки равенства.)Что не было упомянуто, так это то, что многие люди (в том числе и я, конечно) находят
if (variable == constant)
форму более читаемой - это более естественный способ самовыражения. Это причина не копировать слепо соглашение из C. Вы всегда должны подвергать сомнению практики (как вы делаете здесь :), прежде чем предполагать, что то, что может быть полезно в одной среде, полезно в другой.источник
В Java (1.5+) это не имеет особого значения, за исключением случаев, когда объект имеет тип
Boolean
. В таком случае это все еще может пригодиться.if (object = null)
не вызовет сбоя компиляции в Java 1.5+, если объект есть,Boolean
но вызовет ошибку воNullPointerException
время выполнения.источник
В Java нет веской причины.
В нескольких других ответах утверждалось, что это потому, что вы можете случайно назначить его вместо равенства. Но в Java у вас должно быть логическое значение в if, поэтому это:
не будет компилироваться.
Единственный раз, когда это может иметь значение в Java, - это если переменная является логической:
источник
== true
или равно== true == true
.== true
. Но за свою карьеру я видел столько плохого кода, что больше не спрашиваю, зачем кто-то что-то пишет, и просто принимаю тот факт, что некоторые люди написали ненужный / сомнительный код.x == true
как плохой, потому что он может быть ошибочно написанx = true
, не было бы большого смысла менять его наtrue == x
вместо простоx
.Это также тесно связано с:
что удобно, если вы не хотите иметь дело с NPE:
источник
int
это примитивный тип, имеет значение, так как его невозможно вызватьequals
вint
, следовательно, нет смысла обсуждать, использоватьx.equals(constant)
илиconstant.equals(x)
дляint
значений. А дляInteger
значений значение по умолчанию - это,null
а не0
.Этот трюк призван предотвратить
v = null
опечатки.Но Java допускает только логические выражения в качестве
if()
условий, так что этот трюк не имеет особого смысла, компилятор все равно обнаружит эти опечатки.Тем не менее, это по-прежнему ценный трюк для кода C / C ++.
источник
По той же причине, по которой вы делаете это в C; присваивание - это выражение, поэтому вы помещаете литерал слева, чтобы его нельзя было перезаписать, если вы случайно используете
=
вместо==
.источник
x
равно ли5
при ошибочном вводеif (x = 5)
, он будет компилироваться незаметно (и всегда будет вычислятьсяtrue
, независимо от значенияx
). Однако, если вы приобретете привычку всегда указывать сначала литерал: 'if (5 = x)', компилятор может перепроверить вашу работу и сэкономить ваше время в отладчике. Современные компиляторы избавляют от этой привычки.obj
был типаjava.lang.Boolean
(большой B), то это могло иметь значение (я думаю, на самом деле не пробовал или что-то в этом роде).Это для людей, которые предпочитают, чтобы константа была слева. В большинстве случаев наличие константы в левой части предотвратит выброс исключения NullPointerException (или другой нулевой контроль). Например, метод String также выполняет нулевую проверку. Наличие константы слева не даст вам выписать дополнительный чек. Что, по-другому, тоже выполняется позже. Наличие нулевого значения слева - это просто согласованность.
лайк:
источник
Это условие Йоды, написанное по-другому
В Java
состояние йода
источник
Сравните со следующим кодом:
Вывод (после многократного выполнения):
Следовательно,
pingResult != null
это победитель.источник
Из-за его коммутативности единственное различие между
object == null
иnull == object
( версия Йоды ) носит когнитивный характер : как код читается и усваивается читателем. Я не знаю окончательного ответа, но знаю, что лично предпочитаю сравнивать проверяемый мной объект с чем-то другим, а не сравнивать что-то еще с объектом, который я проверяю , если это имеет смысл. Начните с предмета, а затем значения, с которым его нужно сравнить.В некоторых других языках этот стиль сравнения более полезен.
Однако, чтобы обезопасить себя от отсутствия знака «=» в целом, я считаю, что написание
null == object
является ошибочным актом защитного программирования . Лучший способ обойти этот конкретный код - гарантировать поведение с помощью теста junit. Помните, что возможная ошибка отсутствия знака "=" не зависит от входных аргументов метода - вы не зависите от правильного использования этого API другими людьми - поэтому тест junit идеально подходит для защиты от этого. В любом случае вы захотите написать тесты junit для проверки поведения; отсутствующий знак "=" естественно попадает в область действия.источник