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