从方法中获取属性名



我有这个类:

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,我知道它为equalshashcode提供了自动完成选项,这些选项将生成代码,包括对所有声明字段的比较。我不确定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中,以帮助防止哈希冲突。

相关内容

  • 没有找到相关文章

最新更新