Как предотвратить нулевую проверку до равенства - PullRequest
17 голосов
/ 25 октября 2011

Я нахожу такие вещи довольно раздражающими и уродливыми в equals методах:

if (field == null)
{
    if (other.field != null)
        return false;
}
else if ( ! field.equals(other.field))
    return false;

В C # я мог бы сделать это:

if( ! Object.Equals(field, other.field))
    return false;

Есть ли что-то похожее в Java или какой предпочтительный способ сделать это, если что-то есть?

Ответы [ 9 ]

39 голосов
/ 25 октября 2011

Java 7 предлагает java.util.Objects.equals .

23 голосов
/ 25 октября 2011

Используйте 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/

Это примерно эквивалентночто вы делаете в C #

6 голосов
/ 25 октября 2011

Гуава равна , что делает это:

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

или шаблон нулевого объекта

Гуава также имеет несколько связанное сравнениецепь и множество других вкусностей .

4 голосов
/ 25 октября 2011

Я бы написал так:

return field != null && other.field != null && field.equals(other.field);

, которая не так элегантна, как строка кода C #, но намного короче, чем если вы разместили дерево if.

2 голосов
/ 23 июля 2015

Я принимаю все ответы технически.Практически я не буду использовать ни один из них в коде, который находится под моим контролем, потому что все предоставленные решения работают вокруг основной проблемы: нулевых значений.СОХРАНИТЕ СВОЮ ОСНОВНУЮ МОДЕЛЬ БЕСПЛАТНО ОТ NULL-ЗНАЧЕНИЙ, и в этом случае вопрос устарел.

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

Даже если Oracle рекомендует использовать метод equals для нулевой безопасности, подумайте об этом: как только вы примете нулевые значения, ваша модель становится хрупкой.Метод equals не будет последним методом, где вы будете проверять на ноль.Вы должны управлять нулевыми проверками в иерархии вызовов методов.Методы не могут быть повторно использованы из коробки больше.Вскоре каждый параметр будет проверен на нулевое значение.

Я увидел обе стороны:

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

С другой стороны, код с полными выразительными утверждениями, которые ясно дают понять, что они имеют полнофункциональные объекты, которые можно использовать, не опасаясь исключений NullPointerExceptions.

1 голос
/ 06 августа 2015

На самом деле каждый следует своим путем, и я также хотел бы представить здесь отличную информацию.

Есть один путь

field == null ? false : true; // Таким образом, в общем случае он вернет true, если он не равен нулю.

В groovy есть нулевой безопасный оператор для объектов. Давайте возьмем пример для класса

A { 
 String name = "test1"
String surName = "test2"

public String returnName() {

 return name + surName
}

}

A a = null a?.name // Упомянутый оператор ? фактически проверит, является ли null или нет. тогда он вызовет имя.

Примечание: я не использовал точку с запятой в коде, поскольку это не требуется в groovy.

1 голос
/ 25 октября 2011

В рамках Project Coin было предложено добавить серию нулевых безопасных операторов в Java. К сожалению, они не попали в Java 7, может быть, они появятся в Java 8. Здесь - общее представление о том, как они будут работать

0 голосов
/ 23 июля 2015

Используйте оператор == при проверке ссылок на объекты, если обе ссылки ссылаются на один и тот же объект, он вернет true.В противном случае, если вы ищете содержимое объекта, используйте метод объектов .equals.

Так что null означает, что в кучи нет места в памяти.Так что это можно просто проверить с помощью оператора '=='.

0 голосов
/ 25 октября 2011

String.valueOf () решит некоторые из этих проблем, если toString реализован для ваших классов.Он выдаст ответ toString () или «ноль», если указатель нулевой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...