При проверке нулей я использую это:
String str;
if(str == null){
//...
}
но я тоже это видел:
if(null == str){
//...
}
Есть ли преимущество в использовании одного над другим? Или это просто для повышения удобочитаемости?
При проверке нулей я использую это:
String str;
if(str == null){
//...
}
но я тоже это видел:
if(null == str){
//...
}
Есть ли преимущество в использовании одного над другим? Или это просто для повышения удобочитаемости?
Вторая версия (null == str
) называется условием yoda.
Оба они приводят к одному и тому же поведению, но второе имеет одно преимущество: оно предотвращает случайное изменение переменной, когда вы забудете один =
. В этом случае компилятор возвращает ошибку в этой строке, и вы не останетесь с каким-то странным поведением вашего кода и результатом отладки.
Соглашение null == x
обычно находится в коде, написанном людьми, знакомыми с C, где присваивание также может быть выражением. Некоторые программисты на C пишут такой код, чтобы, если они пропустили =
в
if (NULL == ptr)...
код не будет компилироваться, так как NULL = ptr
не является допустимым назначением. Это предотвращает появление довольно скрытой ошибки в базе кода, хотя современные компиляторы C делают эти соглашения устаревшими, если только вы занимаетесь включением и чтением сгенерированных предупреждений...
Этот стиль кодирования никогда не имел никакой пользы в Java, где задания ссылок не могут использоваться в качестве булевых выражений. Его можно считать даже интуитивным; в своем естественном языке большинство людей скажут "если X равно null..." или "если X равно 17...", а не "если null равно X...".
Нет никакой разницы между двумя, кроме чтения. Используйте то, что имеет для вас больше смысла.
Как вы сказали, читаемость является самой важной причиной. Читая его вслух, (null == str) не читается хорошо. Это почти похоже на чтение справа налево. (str == null) читается намного лучше.
Кроме того, я считаю, что необходимо учитывать следующее:
if (str != null)
if (str == null)
против.
if (null != str)
if (null == str)
Я ожидал бы, что положительный (str == null) и отрицательный будут записаны таким же образом, что является еще одной причиной, по которой я хотел бы использовать верхний набор.
if (null == str) {
}
является идиомой программирования из c/С++, где оператор присваивания =
может использоваться для разрешения оператора true/false. Например, в c, если вы хотите проверить, могу ли я открыть поток в c/С++, вы можете
if (myStream = openStream())
который устанавливает раскрытие и назначение в одной строке. Однако это означает, что люди часто набирают =
, когда они означают ==
, и это будет допустимый синтаксис в c: например, if (x = 5)
всегда будет иметь значение true, когда они действительно означают if (x ==5)
. Поэтому люди пишут if (5 == x)
, поэтому, если вы оставите =
, ваш код не будет компилироваться.
Это не относится к java.
Нет никакой реальной разницы. Однако второй считается менее подверженным ошибкам. В первом случае вы не получите ошибку, если попытаетесь сделать
String str;
if(str = null){
}
который вы обычно не делаете в условных выражениях.
Кроме того, вы сначала должны думать о фактическом состоянии, что является хорошей практикой.
if(a==b) {}
совпадает с if(b==a) {}
, и то же самое верно, если b равно null. Это просто различие стиля/порядка в функциональности, по крайней мере, в java.
Некоторые разработчики утверждают, что 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 - это имя".