Можно написать условие вот так:
if (repository == null) {}
а можно вот так:
if (null == repository) {}
В чем разница?
Условиями Йоды (Yoda Conditions) называется приём этот. Первой константа ставится, если ошибётесь и используете = вместо == вы, указал на эту ошибку компилятор вам чтобы. В Java это несущественно, т.к. ошибка будет почти всегда, исключение описано в соседнем ответе.
Есть другой случай, когда порядок сравнения имеет значение в Java — .equals(). Предположим, у вас есть объект, который вы получаете извне метода и образец для сравнения.
if (foo.equals(sample)) {...}
Если сравнивать так, что может случиться, что полученный объект будет равен null и тогда будет выброшено исключение. А ещё это может быть хитрый объект, в котором .equals() переопределено так, чтобы всегда возвращать true.
Гораздо надёжнее сравнивать в обратном порядке:
if (sample.equals(foo)) {...}
equals нужно как минимум один из них проверять на != null.
– Nick Volynkin
Nov 23 '16 at 09:48
null защититься чтобы, Objects.equals() использовать можно, с седьмой начиная джавы.
– Roman
Nov 28 '16 at 07:03
Некоторые наркоманы пишут наоборот, чтобы компилятор напомнил, если они напишут "=", вместо "==". Но в Java строгая типизация - null к boolean не приводится и код с ошибкой не скомпилируется в любом случае, потому разницы нет никакой. В других языках - есть.
Не Java, вместо null можно считать любую другую константу:
if (null = repository) { //compile error
...
}
if (repository = null) { // build success
...
}
В Java прокатит один частный случай:
if (condition = true) { ... }
if(condition), if (!condition)
– Pavel Mayorov
Dec 01 '16 at 10:58
bool через == вместо прямого использования.
– Nick Volynkin
Dec 02 '16 at 16:02
В принципе, в предыдущих ответах всё уже сказано, просто дополню.
В Java условия Йоды с == могут быть полезны только при сравнении boolean, в двух случаях.
1. Если у вас есть метод, возвращающий boolean:
public static boolean getBool() { return true; }
и вы сравниваете результат этого метода с переменной boolean:
boolean bln = false;
if (bln == getBool()) {
//блок if
} else {
//блок else
}
В этом случае должен выполняться блок else. Но если вы вдруг ошибётесь и напишете:
if (bln = getBool()) {
//блок if
} else {
//блок else
}
компилятор не выдаст ошибки, и код выполнится, но выполняться будет блок if. Чтобы не допустить такой ошибки, лучше написать
if (getBool() == bln) {
//блок if
} else {
//блок else
}
потому что написать getBool() = bln по невнимательности компилятор вам не даст.
2. Если вы сравниваете объект Boolean c null:
Boolean booleanObject = null;
if (booleanObject == null) { ... }
Если в этом случае вы вместо == случайно напишете =:
if (booleanObject = null) { ... }
код выполнится, но вы получите NullPointerException. А написать
if (null = booleanObject) { ... }
опять же, компилятор вам не даст.
P.S.
Также условие Йоды в Java может быть полезно при сравнении строк с помощью equals. Например, если вы напишете
if (strVar.equals("string")) {
//блок if
} else {
//блок else
}
получите ошибку в случае, если strVar было равно null, а если напишете
if ("string".equals(strVar)) {
//блок if
} else {
//блок else
}
попадёте в блок else в этом же случае (если strVar было равно null).
equals только со строками, ведь и другие объекты могут быть Null?
– Nick Volynkin
Dec 02 '16 at 16:01
equals не только для строк справедлив, но и для других объектов (всё зависит от того, как у них этот метод equals реализован)
– Ksenia
Dec 02 '16 at 16:57
Разница в порядке сравнения =)
В Java большой разницы нет, сработает и так и эдак, только если Вы будете сравнивать null со всем подряд то програмисты которые потом будут разбирать Ваш код будут ругаться, что это за индус писал, т.к. не стоит забывать про Code Conventions.
repositoryсравнивается сnull, во втором -nullсrepository– mix Nov 23 '16 at 09:24