我有这个类:
public class Book {
private int id;
private String name;
private Something somebody;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Book book = (Book) o;
if (id != book.id && somebody.getId() != book.somebody.getId()) return false;
return true;
}
@Override
public int hashCode() {
return id;
}
}
我想在equals方法中获得这个类中使用的所有属性-在这种情况下,我会从Book中获得"id"(因为在equals方法中没有使用名称),并且我也会获得"某人"。Id ",因为它也在equals方法中用作子对象。
我需要这个信息,所以我可以只序列化这个属性,然后在另一台机器上反序列化时只使用它来比较相等。否则用equals来比较完整的对象就太麻烦了(如果我有太多的子属性)。
如果您正在使用Eclipse IDE,我知道它为equals
和hashcode
提供了自动完成选项,这些选项将生成代码,包括对所有声明字段的比较。我不确定Netbeans或其他ide是否有类似的功能,但如果常用的ide没有,我会感到惊讶。
同样,你的equals
方法不应该比较其他对象的字段,而应该对它们调用equals
:
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Book)) return false; // instanceof is fast these days
Book book = (Book) o;
if (id == book.id &&
// either ensure these are not null or use java.util.Objects.equals()
somebody.equals(book.somebody))
return true;
return false;
}
此外,如果你的哈希码仅仅使用id
,那么也许你的equals
也可以。如果您的对象是不可变的,那么id
就是您所需要的所有比较,并且会更加有效。如果不是这样,那么equals
中使用的检查通常会反映在hashcode
中,以帮助防止哈希冲突。