Java 等于(对象对象对象)“;应与“一起覆盖”;比较(T obj)“;方法

Java 等于(对象对象对象)“;应与“一起覆盖”;比较(T obj)“;方法,java,sonarqube,Java,Sonarqube,我正在写一篇类似的文章。我已经重写了compareTo方法,以便根据日期按降序对对象进行排序 公共类Employee实现了可比较的 { } 我的声纳在抱怨我的方法 如何在此处重写equals方法。如果要重写方法compare to,则必须使用相同的签名。实际签名使用对象参数: @Override public int compareTo(Object o) { return ((Employee) o).getJoinDate().compareTo(joinDate); } 请注意,

我正在写一篇类似的文章。我已经重写了compareTo方法,以便根据日期按降序对对象进行排序

公共类Employee实现了可比较的 {

}

我的声纳在抱怨我的方法


如何在此处重写equals方法。

如果要重写方法
compare to
,则必须使用相同的签名。实际签名使用
对象
参数:

@Override
public int compareTo(Object o)
{
    return ((Employee) o).getJoinDate().compareTo(joinDate);
}
请注意,必须将对象
obj
显式强制转换为
Employee
,否则将无法调用其方法
getJoinDate()

编辑:如果要覆盖
equals()
方法,可以返回比较属性的结果
joinDate

@Override
public boolean equals(Object obj)
{
    return joinDate.equals(((Employee) obj).getJoinDate());
}
注意:无需在
Employee
类中调用
getJoinDate()
,因此您只需执行以下操作:

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


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

@Override
public int compareTo(Object o)
{
    return ((Employee) o).getJoinDate().compareTo(joinDate);
}
请注意,必须将对象
obj
显式强制转换为
Employee
,否则将无法调用其方法
getJoinDate()

编辑:如果要覆盖
equals()
方法,可以返回比较属性的结果
joinDate

@Override
public boolean equals(Object obj)
{
    return joinDate.equals(((Employee) obj).getJoinDate());
}
注意:无需在
Employee
类中调用
getJoinDate()
,因此您只需执行以下操作:

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


将其包含在类中(当重写equals时,还必须重写hashCode):


将其包含在类中(当重写equals时,还必须重写hashCode):


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

除非你有一个很好的理由,否则你应该覆盖
等于
比较到
。一个很好的例子是
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());
}

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

除非你有一个很好的理由,否则你应该覆盖
等于
比较到
。一个很好的例子是
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());
}

我的声纳抱怨说我还需要覆盖equals方法。你能帮我怎么重写equals方法吗here@Patan编辑。请注意,您可以直接使用
joinDate
而不是调用
getJoinDate()
。感谢您提供的详细答案。如果两名员工的加入日期相同,您确定他们应该被视为平等吗?如果他们是完全不同的人呢?更好的解决方案是,如果两个日期相等,则将compareTo更改为返回super.compareTo,并抑制警告。我的声纳抱怨我还需要覆盖equals方法。你能帮我怎么重写equals方法吗here@Patan编辑。请注意,您可以直接使用
joinDate
而不是调用
getJoinDate()
。感谢您提供的详细答案。如果两名员工的加入日期相同,您确定他们应该被视为平等吗?如果他们是完全不同的人呢?更好的解决方案是,如果两个日期相等,则将compareTo更改为返回super.compareTo,并取消显示警告。