Вероятно, это привычка, полученная от C, чтобы избежать такого рода опечаток (одиночное = вместо двойного ==):
if (object = null) {
Соглашение о размещении константы слева от == не очень полезно в Java, поскольку Java требует, чтобы выражение в if оценивалось как значение boolean, поэтому, если константа не является boolean, вы также получите ошибку компиляции. как вы приводите аргументы. (и если это логическое значение, вы все равно не должны использовать ==...)
Ответ 2 · рейтинг 35 · Jon Skeet
Как уже говорили другие, у C есть привычка избегать опечаток, хотя даже в C я ожидаю, что приличные компиляторы с достаточно высокими уровнями предупреждений выдадут предупреждение. Как говорит Чандру, сравнение с null в Java таким образом вызовет проблемы только в том случае, если вы используете переменную типа Boolean (которой нет в примере кода). Я бы сказал, что это довольно редкая ситуация, и не стоит менять способ написания кода где бы то ни было. (Я бы не стал обращать операнды местами даже в этом случае; если я достаточно ясно думаю, чтобы рассмотреть возможность их обращения, я уверен, что смогу сосчитать знаки равенства.)
Что не было упомянуто, так это то, что многие люди (включая меня, безусловно) считают форму if (variable == constant) более удобочитаемой - это более естественный способ самовыражения. Это причина не слепо копировать соглашение из C. Вы всегда должны подвергать сомнению практику (как вы делаете здесь :), прежде чем предполагать, что то, что может быть полезно в одной среде, полезно в другой.
Ответ 3 · рейтинг 28 · Chandra Sekar
Это не имеет большого значения в Java (1.5+), за исключением случаев, когда тип объекта Boolean. В этом случае это все еще может быть удобно.
if (object = null) не приведет к сбою компиляции в Java 1.5+, если объект равен Boolean, но во время выполнения выдаст NullPointerException.
Ответ 4 · рейтинг 9 · R Samuel Klatchko
В Java нет веской причины.
В нескольких других ответах утверждалось, что это потому, что вы можете случайно сделать это присваиванием вместо равенства. Но в Java у вас должно быть логическое значение в if, поэтому так:
if (o = null)
не будет компилироваться.
Единственный раз, когда это может иметь значение в Java, это если переменная является логической:
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
Ответ 5 · рейтинг 9 · cherouvim
Это также тесно связано с:
if ("foo".equals(bar)) {
что удобно, если вы не хотите иметь дело с NPE:
if (bar!=null && bar.equals("foo")) {
Ответ 6 · рейтинг 5 · vava
Этот трюк должен предотвратить v = null вид опечаток.
Но Java допускает только логические выражения в качестве условий if(), так что этот трюк не имеет особого смысла, компилятор все равно найдет эти опечатки.
Тем не менее, это все еще ценный трюк для кода C/C++.
Ответ 7 · рейтинг 3 · Ignacio Vazquez-Abrams
По той же причине, что и в C; присваивание - это выражение, поэтому вы помещаете литерал слева, чтобы его нельзя было перезаписать, если вы случайно используете = вместо ==.
Ответ 8 · рейтинг 3 · SPee
Это для людей, которые предпочитают иметь константу слева. В большинстве случаев наличие константы с левой стороны предотвратит создание исключения NullPointerException (или наличие другой проверки на ноль). Например, метод equals String также выполняет проверку на нулевое значение. Наличие константы слева не позволит вам выписать дополнительный чек. Что, по-другому, также выполняется позже. Наличие нулевого значения слева означает просто согласованность.
как:
String b = null;
"constant".equals(b); // result to false
b.equals("constant"); // NullPointerException
b != null && b.equals("constant"); // result to false
Ответ 9 · рейтинг 2 · Tanmay Naik
Это состояние Йоды, написанное в другой манере.
В Java
String myString = null;
if (myString.equals("foobar")) { /* ... */ } //Will give u null pointer
состояние йода
String myString = null;
if ("foobar".equals(myString)) { /* ... */ } // will be false
Ответ 10 · рейтинг 1 · Avinash
Сравните со следующим кодом:
String pingResult = "asd";
long s = System.nanoTime ( );
if ( null != pingResult )
{
System.out.println ( "null != pingResult" );
}
long e = System.nanoTime ( );
System.out.println ( e - s );
long s1 = System.nanoTime ( );
if ( pingResult != null )
{
System.out.println ( "pingResult != null" );
}
long e1 = System.nanoTime ( );
System.out.println ( e1 - s1 );
Следовательно, pingResult != null является победителем.
Ответ 11 · рейтинг 1 · Benny Bottema
Из-за его коммутативного свойства единственная разница между object == null и null == object (версия Yoda) носит когнитивный характер: как код читается и усваивается читателем . Я не знаю точного ответа, но знаю, что лично я предпочитаю сравнение объекта, который я проверяю, с чем-то другим, а не сравнение чего-то другого с объектом, который я проверяю, если это имеет смысл. Начните с темы, затем значения для сравнения.
В некоторых других языках этот стиль сравнения более удобен.
Однако, чтобы защититься от отсутствующего знака "=" в целом, я думаю, что написание null == object является ошибочным действием защитное программирование. Лучший способ обойти этот конкретный код - гарантировать поведение с помощью теста junit. Помните, что возможная ошибка отсутствия "=" не зависит от входных аргументов метода - вы не зависите от правильного использования этого API другими людьми - поэтому тест junit идеально подходит для защиты от этого. В любом случае вы захотите написать тесты junit для проверки поведения; отсутствующий "=" естественно попадает в область действия.