Java: как писать равно() короче

Я получаю головные боли, когда мне приходится писать почти 10 строк кода, чтобы сказать 2 Objects are equal, when their type is equal and both attribute is equal. Вы можете легко увидеть, что таким образом запись числа строк резко возрастает с вашим количеством атрибутов.

public class Id implements Node {

        private String name;

        public Id(String name) {
                this.name = name;
        }

        public boolean equals(Object o) {
                if (o == null)
                        return false;
                if (null == (Id) o)
                        return false;
                Id i = (Id) o;
                if ((this.name != null && i.name == null) || (this.name == null && i.name != null))
                        return false;
                return (this.name == null && i.name == null) || this.name.equals(i.name);
        }

}

Ответ 1

Если вы используете Eclipse, нажмите " Источник" → " сгенерировать hashCode() и equals()". Существует много вариантов автоматического создания equals().

Ответ 2

Google guava library имеет класс Objects с Objects#equal, который обрабатывает значение nullness. Это действительно помогает уменьшить количество вещей. В вашем примере я бы написал:

@Override public boolean equals(Object other) {
  if (!(other instanceof Id)) {
    return false;
  }
  Id o = (Id) other;
  return Objects.equal(this.name, o.name);
}

Документация здесь.

Также обратите внимание, что есть Objects#hashCode и Objects#toStringHelper, чтобы помочь с hashCode и toString!

Также см. Эффективное Java 2nd Edition о том, как писать equals().

Ответ 3

Есть библиотеки, которые сделают это для вас. Например, commons-lang имеет EqualsBuilder

Кроме того, эти две строки, похоже, делают одно и то же:

            if (o == null)
                    return false;
            if (null == (Id) o)
                    return false;

Возможно, вы имели в виду это:

            if (o == null)
                    return false;
            if (this == o)
                    return true;

Ответ 4

Проект Lombok также имеет генератор equals и hashCode, используя аннотацию @EqualsAndHashCode, которая имеет то преимущество, что она синхронизирована с текущий класс/исходный код. Я не уверен в деталях реализации, но, безусловно, стоит посмотреть, если вам нужно срубить треск.

Ответ 5

Более простой способ (помимо генерации кода) может быть.

public boolean equals(Object o) {
   return o instanceof Id 
        && (name == null ? ((Id)o).name == null : name.equals(((Id)o).name);
}