Способ проверить, является ли поток нулевым или нет (в Java), имеет значение положение операнда - PullRequest
1 голос
/ 30 января 2020

ПРИМЕЧАНИЕ: Я прошел через это, но не получил свой ответ Лучший способ проверить наличие нулевых значений в Java? и (obj == null) vs (null == obj)?

Я изучал эту Android [Java] официальную документацию по фоновым задачам -> Выполнить код в потоке пула потоков -> Выполнить код прерывания , и нулевой контрольный код в примере:

if (null != thread) {
    thread.interrupt();
}

, который отличается от того, что мы обычно видим / используем:

if (object != null) {
    //do something;
}

Итак, мой вопрос таков:

Имеет ли какое-то значение (например, помогает избежать нулевого указателя или чего-то еще), если мы напишем «нуль! = Нить» вместо «нить! = Нуль» или официальная документация Google просто случайным образом меняет операнды без какой-либо выгоды?

РЕДАКТИРОВАТЬ:

  1. Я спрашиваю о ! = , а не == . В случае == , программист может выполнять присваивание ( = ) вместо сравнения ( == ). Но это не относится к ! = .
  2. Я говорю о Java, а не C language . Так что это назначение и сравнение путаница здесь не применимо.

1 Ответ

2 голосов
/ 30 января 2020

Нет семанти c Разница

if (null != thread) {
    thread.interrupt();
}

Почему в противном случае яркие люди в Google написали нулевую проверку таким обратным способом, остается догадкой. Я согласен с вами, что его труднее читать, чем естественное thread != null.

Нет никакого выигрыша от обратной записи. Семантика точно такая же.

Обратная запись условия if известна как условие Йода . Условия Yoda обсуждаются, некоторые говорят, что при некоторых обстоятельствах они имеют место в некоторых языках программирования (например, C). В случае == вместо != для сравнения вы можете прочитать некоторые аргументы в ранее связанном дубликате (я повторяю ссылку внизу). В Java можно использовать искомый аргумент в случае, подобном следующему:

boolean b;
if (b == false) {
    // Do something
}

Представьте, что программист из Pascal или другого языка программирования, который использует один = для сравнения и положить сингл = здесь по ошибке. Это изменит смысл назначения false на b и никогда не будет выполнять условный код. Таким образом, аргумент гласит, что при написании false == b компилятор поймает такую ​​ошибку для вас, что является явным преимуществом. Однако:

  1. Большинство компиляторов и IDE все равно улавливают ошибку. Например, если я добавлю один = в приведенный выше оператор if, мое Затмение скажет

    Возможное случайное назначение вместо сравнения. Выражение условия не должно сводиться к присваиванию

  2. Оператор if обычно записывается следующим образом, что исключает любые содержательные дебаты об условии Йоды и является также обычно рекомендуется:

    if (! b) {
        // Do something
    }
    

Итак, возвращаясь к вашему вопросу, я предполагаю: программист в Google имел привычку писать условия Йоды типа null == thread и по ложной аналогии расширил его на null != thread тоже.

Так не имеет ли порядок операндов! = семантика?

Ради полноты, когда я говорю, что thread != null и null != thread имеют та же семантика, я говорю об этом цитируемом коде. В случае, например, someObj.foo() != anotherObj.bar() порядок накладывает порядок двух вызовов метода. Если оба метода имеют побочные эффекты, которые как-то мешают, порядок применения этих побочных эффектов может иметь значение в некоторых случаях.

Ссылки

...