有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java equals方法的良好设计

我看到了:

// Returns whether o refers to a Point object with  
// the same (x, y) coordinates as this Point object 
public boolean equals(Object o) {
    if (o instanceof Point) {
        Point other = (Point) o;
        return x == other.x && y == other.y;
    } else {
        return false;
    } 
}

为什么要求equals方法的参数接受一个Point对象不是更明智(也更简单)呢。然后,如果我们试图比较一个点和一个非点,那么编译器将捕获它。那不是更好吗


共 (3) 个答案

  1. # 1 楼答案

    因为这样它就不会覆盖^{},这是许多标准库算法用于检查两个对象相等性的方法

    这些算法中的许多都可以对不同类型的对象进行操作,这就需要equals可以将您的对象与任何其他类中的一个进行比较

  2. # 2 楼答案

    您可以在Apache Commons库中简单地使用EqualBuilder类。 https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html

    public boolean equals(Object obj) {
        if (obj == null) { return false; }
        if (obj == this) { return true; }
        if (obj.getClass() != getClass()) {
          return false;
        }
        MyClass rhs = (MyClass) obj;
        return new EqualsBuilder()
                      .appendSuper(super.equals(obj))
                      .append(field1, rhs.field1)
                      .append(field2, rhs.field2)
                      .append(field3, rhs.field3)
                      .isEquals();
    }
    

    会是

    public boolean equals(Object obj) {
        return EqualsBuilder.reflectionEquals(this, obj);
    }
    
  3. # 3 楼答案

    因为这打破了重写的第一条规则,并成为Object类的equals()方法的重载

    方法重写规则:

    • 参数列表应与 重写的方法
    • 返回类型应与返回类型相同或是返回类型的子类型 在超类中的原始重写方法中声明
    • 访问级别的限制不能比重写的更严格 方法的访问级别。例如:如果超类方法是 声明为public,则子类中的重写方法无法 要么是私人的,要么是受保护的
    • 仅当实例方法由 子类
    • 无法重写声明为final的方法
    • 声明为静态的方法不能被重写,但可以重新声明
    • 如果无法继承方法,则无法重写该方法
    • 与实例的超类位于同一包中的子类可以 重写任何未声明为private或final的超类方法
    • 不同包中的子类只能重写非final 方法声明为公共或受保护