equals(Object obj)“应该与”compareTo(T obj)“方法一起被覆盖

时间:2014-05-28 08:44:22

标签: java sonarqube

我正在写一个类似的课程。我已经重写了compareTo方法,以降序为基础按日期对对象进行排序。

public class Employee实现Comparable {

private Timestamp joinDate;

public Timestamp getJoinDate()
{
    return joinDate;
}

public void setJoinDate(Timestamp joinDate)
{
    this.joinDate = joinDate;
}

@Override
public int compareTo(Employee a)
{
    //sort employess based on join date desc
    return a.getJoinDate().compareTo(this.getJoinDate());
}

}

我的声纳正在抱怨重写equals方法。

如何在此处覆盖equals方法。

3 个答案:

答案 0 :(得分:2)

如果要覆盖方法compareTo,则必须使用相同的签名。实际签名使用Object参数:

@Override
public int compareTo(Object o)
{
    return ((Employee) o).getJoinDate().compareTo(joinDate);
}

请注意,您必须明确将<{1}}投射obj,否则您将无法调用其方法Employee

修改:如果您要覆盖getJoinDate()方法,可以返回比较属性equals()的结果:

joinDate

注意:没有必要在@Override public boolean equals(Object obj) { return joinDate.equals(((Employee) obj).getJoinDate()); } 课程内拨打getJoinDate(),所以你可以这样做:

Employee

return ((Employee) o).joinDate.compareTo(joinDate);

答案 1 :(得分:2)

在你的类中包含它(当你重写equals时,你还必须覆盖hashCode):

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((joinDate == null) ? 0 : joinDate.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Snippet other = (Snippet) obj;
    if (joinDate == null) {
        if (other.joinDate != null)
            return false;
    } else if (!joinDate.equals(other.joinDate))
        return false;
    return true;
}

答案 2 :(得分:0)

.equals() == true.compareTo(...) == 0表示的内容之间存在差异。 equals()方法用于检查两个对象是否相等,而compareTo用于设置元素之间的关系顺序,一个是否大于另一个,另一个更大然后是第一个,或者这一个都不适用,这通常意味着对象是相等的。

除非您有非常好的理由,否则您应该覆盖equalscompareTo。一个很好的理由是BigDecimal类,其中equals比较对象的值及其比例,而compareTo只比较值。

对于您的情况,我会覆盖equals(),如下所示:

@Override 
public int hashCode() {
    return this.getJoinDate().hashCode();
}

@Override
public boolean equals(Object obj) {
    //correct argument check
    if (!(obj instanceof Employee)) {
         return false;
    }

    //check nulls
    if (obj == null) {
        return false;
    }
    Employee other = (Employee) obj;
    if (this.getJoinDate() == null) {
        return other.getJoinDate() == null;
    }
    return this.getJoinDate().equals(other.getJoinDate());
}