【问题标题】:equals(Object obj)" should be overridden along with the "compareTo(T obj)" methodequals(Object obj)" 应该与 "compareTo(T obj)" 方法一起被覆盖
【发布时间】:2014-05-28 08:44:22
【问题描述】:

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

公共类 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());
}

}

我的 Sonar 抱怨要覆盖 equals 方法。

如何在此处覆盖 equals 方法。

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    如果你想覆盖方法compareTo,你必须使用same签名。实际签名使用Object 参数:

    @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);
    

    return joinDate.equals(((Employee) obj).joinDate);
    

    【讨论】:

    • 我的声纳抱怨我还需要重写 equals 方法。你能帮我如何在这里覆盖equals方法
    • @Patan 已编辑。请注意,您可以直接使用joinDate,而不是调用getJoinDate()
    • 感谢您的详细回答。
    • 如果两个员工的入职日期相同,您确定他们应该被视为平等吗?如果他们是完全不同的人呢?如果两个日期相等,更好的解决方案是更改 compareTo 以返回 super.compareTo,并禁止警告。
    【解决方案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;
    }
    

    【讨论】:

      【解决方案3】:

      .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());
      }
      

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多