Проверка нулевого - в каком порядке?
При проверке нулей я использую это:
String str;
if(str == null){
//...
}
но я тоже это видел:
if(null == str){
//...
}
Есть ли преимущество в использовании одного над другим? Или это просто для повышения удобочитаемости?
Ответы
Ответ 1
Вторая версия (null == str
) называется условием yoda.
Оба они приводят к одному и тому же поведению, но второе имеет одно преимущество: оно предотвращает случайное изменение переменной, когда вы забудете один =
. В этом случае компилятор возвращает ошибку в этой строке, и вы не останетесь с каким-то странным поведением вашего кода и результатом отладки.
Ответ 2
Соглашение null == x
обычно находится в коде, написанном людьми, знакомыми с C, где присваивание также может быть выражением. Некоторые программисты на C пишут такой код, чтобы, если они пропустили =
в
if (NULL == ptr)...
код не будет компилироваться, так как NULL = ptr
не является допустимым назначением. Это предотвращает появление довольно скрытой ошибки в базе кода, хотя современные компиляторы C делают эти соглашения устаревшими, если только вы занимаетесь включением и чтением сгенерированных предупреждений...
Этот стиль кодирования никогда не имел никакой пользы в Java, где задания ссылок не могут использоваться в качестве булевых выражений. Его можно считать даже интуитивным; в своем естественном языке большинство людей скажут "если X равно null..." или "если X равно 17...", а не "если null равно X...".
Ответ 3
Нет никакой разницы между двумя, кроме чтения. Используйте то, что имеет для вас больше смысла.
Ответ 4
Как вы сказали, читаемость является самой важной причиной. Читая его вслух, (null == str) не читается хорошо. Это почти похоже на чтение справа налево. (str == null) читается намного лучше.
Кроме того, я считаю, что необходимо учитывать следующее:
if (str != null)
if (str == null)
против.
if (null != str)
if (null == str)
Я ожидал бы, что положительный (str == null) и отрицательный будут записаны таким же образом, что является еще одной причиной, по которой я хотел бы использовать верхний набор.
Ответ 5
if (null == str) {
}
является идиомой программирования из c/С++, где оператор присваивания =
может использоваться для разрешения оператора true/false. Например, в c, если вы хотите проверить, могу ли я открыть поток в c/С++, вы можете
if (myStream = openStream())
который устанавливает раскрытие и назначение в одной строке. Однако это означает, что люди часто набирают =
, когда они означают ==
, и это будет допустимый синтаксис в c: например, if (x = 5)
всегда будет иметь значение true, когда они действительно означают if (x ==5)
. Поэтому люди пишут if (5 == x)
, поэтому, если вы оставите =
, ваш код не будет компилироваться.
Это не относится к java.
Ответ 6
Нет никакой реальной разницы. Однако второй считается менее подверженным ошибкам. В первом случае вы не получите ошибку, если попытаетесь сделать
String str;
if(str = null){
}
который вы обычно не делаете в условных выражениях.
Кроме того, вы сначала должны думать о фактическом состоянии, что является хорошей практикой.
Ответ 7
if(a==b) {}
совпадает с if(b==a) {}
, и то же самое верно, если b равно null. Это просто различие стиля/порядка в функциональности, по крайней мере, в java.
Ответ 8
Некоторые разработчики утверждают, что var == null
более подвержен ошибкам, чем null == var
. Их аргумент состоит в том, что вы можете случайно назначить переменную вместо выполнения проверки нулями.
Но только тогда, когда переменная, которую вы тестируете против null
, является Boolean
, вы можете случайно использовать =
вместо ==
, и она будет компилироваться.
Boolean checked = Boolean.TRUE;
if(checked = null){ // accidentally assigned null and compiles
}
Только в этом случае присваивание компилируется, потому что условное выражение должно оцениваться с помощью логического значения. См. JLS-14.9. Поскольку само присваивание присваивается булевому типу, оно компилируется. Но вы получите NullPointerException
в runtume, потому что java попытается распаковать переменную checked
, которая равна null
.
Если вы используете какой-либо другой тип, тогда Boolean
вы получите ошибку компилятора. Например.
String str = "hello";
if(str = null){ // compiler error, because str = null doesn't evaluate to a boolean
}
Мое заключение заключается в том, что ситуации с ошибками крайне редки, и вы можете легко написать модульные тесты, которые обнаруживают такие ошибки.
Поэтому напишите if-statement так, чтобы он был более читаемым.
Я думаю, что "если имя равно null" имеет смысл тогда "если null - это имя".