возразить == пустой указатель или пустой указатель == объект?

Я получил известие от кого-то это null == object лучше, чем object == null проверить

например:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}

Есть ли какие-либо причины, или это - другой миф? Спасибо за справку.

94
задан Raedwald 22 January 2015 в 20:54
поделиться

8 ответов

Это, вероятно, привычка, которую выучили у C, чтобы избежать подобной опечатки (одиночный = вместо двойного = = ):

if (object = null) {

Соглашение о помещении константы слева от == на самом деле бесполезно в Java, поскольку Java требует, чтобы выражение в if вычислить до логического значения, поэтому, если константа не является логическим , вы получите ошибку компиляции в любом случае, если вы укажете аргументы. (и если это логическое значение, вы все равно не должны использовать == ...)

135
ответ дан 24 November 2019 в 06:02
поделиться

Как говорили другие, у C есть привычка избегать опечаток, хотя даже в C я бы ожидал, что достойные компиляторы с достаточно высокими уровнями предупреждений будут предупреждение. Как говорит Чандру, сравнение с null в Java таким способом вызовет проблемы только в том случае, если вы используете переменную типа Boolean (которой нет в примере кода). Я бы сказал, что это довольно редкая ситуация, и не та, для которой стоит менять способ написания кода где бы то ни было. (Я бы не стал переставлять операнды местами даже в этом случае; если я достаточно ясно мыслю, чтобы рассмотреть возможность их перестановки, я уверен, что могу сосчитать знаки равенства.)

Чего не имеет ] было упомянуто, что многие люди (в том числе и я, конечно) находят форму if (variable == constant) более удобочитаемой - это более естественный способ самовыражения. Это причина , а не слепого копирования соглашения из C. Вы всегда должны подвергать сомнению методы (как вы делаете здесь :), прежде чем предполагать, что то, что может быть полезно в одной среде, полезно в другой.

31
ответ дан 24 November 2019 в 06:02
поделиться

Это не имеет большого значения в Java (1.5+), за исключением случаев, когда тип объекта - Boolean . В этом случае это все еще может пригодиться.

if (object = null) не вызовет сбой компиляции в Java 1.5+, если объект Boolean , но вызовет исключение NullPointerException во время выполнения.

27
ответ дан 24 November 2019 в 06:02
поделиться

В Java нет веской причины.

В нескольких других ответах утверждалось, что это потому, что вы можете случайно сделать это присваивание вместо равенства. Но в Java вы должны иметь логическое значение в if, поэтому это:

if (o = null)

не будет компилироваться.

В Java это может иметь значение только в том случае, если переменная является логической:

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality
9
ответ дан 24 November 2019 в 06:02
поделиться

Этот трюк предназначен для предотвращения опечаток v = null .

Но Java допускает только логические выражения в качестве условий if () , так что этот трюк не имеет особого смысла, компилятор все равно найдет эти опечатки.

Тем не менее, это по-прежнему ценный трюк для кода C / C ++.

5
ответ дан 24 November 2019 в 06:02
поделиться

Это для тех, кто предпочитает иметь константу слева. В большинстве случаев наличие константы в левой части предотвращает возникновение NullPointerException (или другой проверки нуля). Например, метод String equals также проверяет нулевое значение. Наличие константы слева избавит вас от написания дополнительной проверки. Которая, в другом случае, также будет выполнена позже. Расположение нулевого значения слева - это просто последовательность.

like:

 String b = null;
 "constant".equals(b);  // result to false
 b.equals("constant");  // NullPointerException
 b != null && b.equals("constant");  // result to false
3
ответ дан 24 November 2019 в 06:02
поделиться

По той же причине вы сделать это на C; присваивание - это выражение, поэтому вы помещаете литерал слева, чтобы его нельзя было перезаписать, если вы случайно используете = вместо == .

3
ответ дан 24 November 2019 в 06:02
поделиться

Это также тесно связано с:

if ("foo".equals(bar)) {

что удобно, если вы не хотите иметь дело с NPEs:

if (bar!=null && bar.equals("foo")) {
7
ответ дан 24 November 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: