如何用Java编写平等方法

米兰·门德帕拉:

考虑将相等方法添加到以下简单点类中:

public class Point {

    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    // ...
}

//我对等值的定义

public boolean equals(Point other) {
  return (this.getX() == other.getX() && this.getY() == other.getY());
}

这种方法有什么问题?乍一看,它似乎可以正常工作:

Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);

Point q = new Point(2, 3);

System.out.println(p1.equals(p2)); // prints true

System.out.println(p1.equals(q)); // prints false

但是,一旦开始将点放入集合中,麻烦就开始了:

import java.util.HashSet;

HashSet<Point> coll = new HashSet<Point>();
coll.add(p1);

System.out.println(coll.contains(p2)); // prints false

即使coll已添加p1,并且p1和p2是相等的对象,怎么可能不包含coll呢?

DwB:

的确,hashCode()当您实施时应该实施equals(),但这不会引起问题。

那不是equals()您要寻找方法。equals方法必须始终具有以下签名:“ public boolean equals(Object object)”。这是一些代码。

public boolean equals(Object object)
{
  if (object == null)
  {
    return false;
  }

  if (this == object)
  {
    return true;
  }

  if (object instanceof Point)
  {
    Point point = (Point)object;
    ... now do the comparison.
  }
  else
  {
     return false;
  }
}

阿帕奇EqualsBuilder类是平等的实现是有用的。该链接是较旧的版本,但仍然适用。

如果您喜欢Apache EqualsBuilder,那么您可能也会喜欢Apache HashCodeBuilder类

编辑:更新了标准快捷方式的equals方法示例。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章