所以,我有这个课程:
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”(因为name不用于equals方法),我也会得到“somebody.id” “因为这也在equals方法中用作子对象。
我需要这个信息,所以我只能序列化这个属性,然后在另一台机器上反序列化时只使用它来比较equals。否则,将equals的完整对象进行比较会非常麻烦(如果我有太多的子属性)。
答案 0 :(得分:0)
如果您使用的是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
中,以帮助防止哈希冲突。