Я получил известие от кого-то это null == object
лучше, чем object == null
проверить
например:
void m1(Object obj ) {
if(null == obj) // Is this better than object == null ? Why ?
return ;
// Else blah blah
}
Есть ли какие-либо причины, или это - другой миф? Спасибо за справку.
Это, вероятно, привычка, которую выучили у C, чтобы избежать подобной опечатки (одиночный =
вместо двойного = =
):
if (object = null) {
Соглашение о помещении константы слева от ==
на самом деле бесполезно в Java, поскольку Java требует, чтобы выражение в if
вычислить до логического
значения, поэтому, если константа не является логическим
, вы получите ошибку компиляции в любом случае, если вы укажете аргументы. (и если это логическое значение, вы все равно не должны использовать ==
...)
Как говорили другие, у C есть привычка избегать опечаток, хотя даже в C я бы ожидал, что достойные компиляторы с достаточно высокими уровнями предупреждений будут предупреждение. Как говорит Чандру, сравнение с null в Java таким способом вызовет проблемы только в том случае, если вы используете переменную типа Boolean
(которой нет в примере кода). Я бы сказал, что это довольно редкая ситуация, и не та, для которой стоит менять способ написания кода где бы то ни было. (Я бы не стал переставлять операнды местами даже в этом случае; если я достаточно ясно мыслю, чтобы рассмотреть возможность их перестановки, я уверен, что могу сосчитать знаки равенства.)
Чего не имеет ] было упомянуто, что многие люди (в том числе и я, конечно) находят форму if (variable == constant)
более удобочитаемой - это более естественный способ самовыражения. Это причина , а не слепого копирования соглашения из C. Вы всегда должны подвергать сомнению методы (как вы делаете здесь :), прежде чем предполагать, что то, что может быть полезно в одной среде, полезно в другой.
Это не имеет большого значения в Java (1.5+), за исключением случаев, когда тип объекта - Boolean
. В этом случае это все еще может пригодиться.
if (object = null)
не вызовет сбой компиляции в Java 1.5+, если объект Boolean
, но вызовет исключение NullPointerException
во время выполнения.
В Java нет веской причины.
В нескольких других ответах утверждалось, что это потому, что вы можете случайно сделать это присваивание вместо равенства. Но в Java вы должны иметь логическое значение в if, поэтому это:
if (o = null)
не будет компилироваться.
В Java это может иметь значение только в том случае, если переменная является логической:
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
Этот трюк предназначен для предотвращения опечаток v = null
.
Но Java допускает только логические выражения в качестве условий if ()
, так что этот трюк не имеет особого смысла, компилятор все равно найдет эти опечатки.
Тем не менее, это по-прежнему ценный трюк для кода C / C ++.
Это для тех, кто предпочитает иметь константу слева. В большинстве случаев наличие константы в левой части предотвращает возникновение 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
По той же причине вы сделать это на C; присваивание - это выражение, поэтому вы помещаете литерал слева, чтобы его нельзя было перезаписать, если вы случайно используете =
вместо ==
.
Это также тесно связано с:
if ("foo".equals(bar)) {
что удобно, если вы не хотите иметь дело с NPEs:
if (bar!=null && bar.equals("foo")) {