Как предотвратить нулевую проверку до равных
Я считаю такие вещи довольно раздражающими и уродливыми в методах equals
:
if (field == null)
{
if (other.field != null)
return false;
}
else if ( ! field.equals(other.field))
return false;
В С# я мог бы сделать это:
if( ! Object.Equals(field, other.field))
return false;
Есть ли что-то подобное в Java или какой предпочтительный способ сделать этот вид, если вещь?
Ответы
Ответ 1
Использование commons-lang:
org.apache.commons.lang.ObjectUtils.equals(Object object1, Object object2)
Исходный код:
public static boolean equals(Object object1, Object object2) {
if (object1 == object2) {
return true;
}
if ((object1 == null) || (object2 == null)) {
return false;
}
return object1.equals(object2);
}
Из Apache
http://commons.apache.org/lang/
Что эквивалентно тому, что вы делаете в С#
Ответ 2
Java 7 предлагает java.util.Objects.equals.
Ответ 3
Guava equal, который делает это:
public static boolean equal(@Nullable Object a, @Nullable Object b) {
return a == b || (a != null && a.equals(b));
}
или шаблон нулевого объекта
Гува также имеет несколько связанную цепочку сравнения и загрузку других лакомств.
Ответ 4
Я бы написал это так:
return field != null && other.field != null && field.equals(other.field);
который не так изящен, как строка кода С#, но намного короче, чем опубликованное вами дерево.
Ответ 5
Я принимаю все ответы технически. Практически я не буду использовать ни один из них в коде, который я контролирую, потому что все предоставленные решения работают вокруг основной проблемы: значения null. СОХРАНЯЙТЕ СВОЮ ОСНОВНУЮ МОДЕЛЬ БЕСПЛАТНО ОТ НУЛЬТНЫХ ЗНАЧЕНИЙ, и в этом случае вопрос устарел.
В системных границах, таких как сторонние библиотеки, иногда приходится иметь дело с нулевыми значениями. Они должны быть преобразованы в значимые значения для базовой модели. Там данные решения полезны.
Даже если Oracle рекомендует equals-Methods быть нулевым, подумайте об этом: после принятия нулевых значений ваша модель становится хрупкой. Метод equals не будет последним методом, где вы проверите значение null. Вы должны управлять нулевыми проверками в иерархии вызовов метода. Методы не могут быть повторно использованы из коробки больше. Вскоре каждый параметр будет проверен на значение null.
Я видел обе стороны:
С одной стороны код, полный нулевых проверок, методы, которые больше не доверяют ни одному параметру, и разработчикам, которые боятся забыть нулевую проверку.
С другой стороны, код с полными выразительными утверждениями, в которых явные утверждения содержат полные функциональные объекты, которые можно использовать, не опасаясь NullPointerExceptions.
Ответ 6
В рамках Project Coin было предложено добавить к Java ряд нулевых операторов. К сожалению, они не попали в Java 7, может быть, они появятся на Java 8. Здесь - общая идея того, как они будут работать
Ответ 7
На самом деле все следуют за своим способом сделать это, а также я хотел бы представить здесь groovy.
Существует один способ
field == null ? false : true;
//Таким образом, в основном он вернет true, если он не является нулевым.
В groovy для объектов есть нулевой безопасный оператор. Возьмем пример для класса
A {
String name = "test1"
String surName = "test2"
public String returnName() {
return name + surName
}
}
A a = null
a?.name
// Упомянутый оператор ?
будет фактически проверять, является ли a null
или нет. то он будет вызывать имя.
Примечание: я не применял код с запятой в код, поскольку это не требуется в groovy.
Ответ 8
String.valueOf() решит некоторые из этих проблем, если toString реализована для ваших классов. Он выплюнет ответ toString() или "null", если указатель имеет значение null.
Ответ 9
Использовать == оператор, когда вы проверяете ссылки на объекты, если обе ссылки ссылаются на один и тот же объект, он вернет true. В противном случае, если вы ищете контент объекта, перейдите к методу .equals объектов.
Таким образом, null означает, что у него нет памяти, указанной в куче. Поэтому его можно просто проверить с помощью оператора "==".