Проверка нулевого - в каком порядке?

При проверке нулей я использую это:

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 - это имя".