2008-12-03 5 views
2

Как реализовать это сравнение равенства - разумный java-способ?Сравнение равенства - любой здравый способ?

boolean x = (a == b) || (a.equals(b)) 

Я хочу, чтобы убедиться, что содержание обоих объектов равны, но нуль также хорошо, то есть и может быть пустым и, таким образом, равны.

Обновление: только чтобы быть ясным, мне нужно выполнить это сравнение несколько раз и не хочу копировать & вставлять этот материал каждый раз, особенно с длинными именами объектов. С 'a' и 'b' он выглядит небольшим и простым, но имеет тенденцию к росту ... Я хотел бы узнать, не хватает ли я какой-либо существующей функции Java для этого.

ответ

5

Что происходит, если a имеет значение null, но b не является? Я думаю, что вы действительно хотите:

boolean x = (a == null && b == null) || (a != null && a.equals(b)) 

EDIT: Вы могли бы реализовать статический метод NullEquals для класса, который принимает два объекта этого класса и делает сравнение, как описано выше, чтобы избежать перезаписи и сделать код немного чище ,

public class MyClass { 

    public static boolean NullEquals(MyClass a, MyClass b) 
    { 
     return (a == null && b == null) || (a != null && a.equals(b)); 
    } 
} 


if (MyClass.NullEquals(a,b)) 
{ 
    ... 
} 
+0

Благодарим за исправление – 2008-12-03 13:11:36

+0

, но если a равно null, а b - нет, вы также получите нулевой указатель – 2008-12-03 13:13:41

5

Типичная картина:

if (a == b) 
{ 
    return true; 
} 
if (a == null || b == null) 
{ 
    return false; 
} 
// Now deal with a and b, knowing that they are non-identical, non-null references 

Да, это многословное - но если разделить его на свой собственный метод, вы можете держать его под разумным контролем.

8

Другой способ сделать

boolean x = null==a ? null==b : a.equals(b); 
+0

Мне это нравится - обернуто соответствующим образом в методе - за исключением того, что я ненавижу стиль сравнения константы с переменной а не наоборот. Конечно, в Java это не обязательно. – tvanfosson 2008-12-03 13:33:04

1

Не прямого ответа, но если у вас есть много объектов, которые могут быть или не равно нулю, может быть, что указывает на некоторую проблему с вашим кодом. Взгляните на Null Pattern, что является альтернативным способом представления отсутствия объекта

0

Не могу добавить комментарий, Рассматривайте это как комментарий к Jon Skeet.

Does Null = Null true или false на Java.

Более конкретно то, что должно быть Null = Нуль должно рассматриваться, и как и почему разные языки рассматривают этот случай?

0

Самый распространенный способ сделать это:

a==null ? b==null : a.equals(b) 

А потенциально немного более эффективным, но менее ясно, выражения является:

a==b || (a!=null && a.equals(b)) 

Конечно, Вы можете поместить это внутри метода:

public static boolean eq(Object a, Object b) { 
    return a==b || (a!=null && a.equals(b)); 
} 

Обратите внимание на исходный код вопроса NPE, если a имеет значение null и b не является нулевым.

0

По соображениям производительности, как правило, хорошо проверить подлинность перед выполнением любой другой логики, как это было сделано в вопросе. Однако многие ответы не учитывают это.

Лучшее место, чтобы поставить проверку личности в реализации метода equals на классе:

public boolean equals(Object obj) { 
    if(this == obj) return true; 
    ... 
} 

Если это/может быть сделано, вы можете сделать сравнение легко:

a == null ? b == null : a.equals(b); 

в противном случае вы, возможно, придется проверить идентичность самостоятельно:

a == null ? b == null : (a == b || a.equals(b)); 
1

О нас:

boolean x = equals(a, b); 

public static boolean equals(Object a, Object b) { 
    if (a == null && a == b) { 
     return true; 
    } else { 
     return a == b || a.equals(b); 
    } 
} 

Позвольте мне видеть.

  • если равна нулю и является Ь, то это нормально
  • если не равно нулю, то если == Ь (такой же ссылка) возвращает истину от короткого замыкания
  • если не б (2dns часть of OR, возможно, b является нулевым), затем возвращают (не нулевые) .equals (b) любые b -

Yeap coated.