Как предотвратить нулевую проверку до равных

Я считаю такие вещи довольно раздражающими и уродливыми в методах 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/

Что эквивалентно тому, что вы делаете в С#

Ответ 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 означает, что у него нет памяти, указанной в куче. Поэтому его можно просто проверить с помощью оператора "==".