Ответ 1
Если вы используете Eclipse, нажмите " Источник" → " сгенерировать hashCode() и equals()". Существует много вариантов автоматического создания equals().
Я получаю головные боли, когда мне приходится писать почти 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);
}
}
Если вы используете Eclipse, нажмите " Источник" → " сгенерировать hashCode() и equals()". Существует много вариантов автоматического создания equals().
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()
.
Есть библиотеки, которые сделают это для вас. Например, commons-lang имеет EqualsBuilder
Кроме того, эти две строки, похоже, делают одно и то же:
if (o == null)
return false;
if (null == (Id) o)
return false;
Возможно, вы имели в виду это:
if (o == null)
return false;
if (this == o)
return true;
Проект Lombok также имеет генератор equals
и hashCode
, используя аннотацию @EqualsAndHashCode
, которая имеет то преимущество, что она синхронизирована с текущий класс/исходный код. Я не уверен в деталях реализации, но, безусловно, стоит посмотреть, если вам нужно срубить треск.
Более простой способ (помимо генерации кода) может быть.
public boolean equals(Object o) {
return o instanceof Id
&& (name == null ? ((Id)o).name == null : name.equals(((Id)o).name);
}