最佳实践和有效的equals()覆盖方法

时间:2013-09-09 15:13:52

标签: java intellij-idea

第一个是我使用intelliJ IDEA生成的代码,另一个是我通过参考Oracle教程编写的代码。

哪一个最实用,效率更高?

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Member member = (Member) o;

    if (!email.equals(member.email)) return false;

    return true;
}


@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o instanceof Member) {
        return email.equals(((Member) o).getEmail());
    } else {
        return false;
    }
}

5 个答案:

答案 0 :(得分:3)

关于效率,它们是等效的。使用第一个或第二个对性能没有影响。我更喜欢第一种,因为它“保护”你不会将对象与子类中的对象进行比较,从而导致奇怪的,不预期的和不一致的结果。

答案 1 :(得分:1)

如果我有class B extends Member,那么Binstanceof Member,因此在许多情况下它容易出错。第一种解决方案是最好的。选择ICE生成的那个。

答案 2 :(得分:1)

生成的

+1因为:

  • 你不会犯错误
  • 代码更快
  • 没有instanceof运营商

答案 3 :(得分:0)

我会选择IDE生成的那个,因为它更容易创建,并且不太可能包含错误。在极少数情况下,这是不够的,您将知道需要进行哪些更改以满足您的特定目的。

答案 4 :(得分:0)

第一个是(恕我直言)更正确。 第二个也为你的类的子类返回true,这可能不是你想要的......(见http://www.artima.com/lejava/articles/equality.html