如何检查价值平等?

时间:2012-04-02 13:18:55

标签: java

我是Java初学者,所以请忍受这个。

我有一个班级:

class Point {
  public int x;
  public int y;

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

我创建了两个实例:

Point a = new Point(1, 1);
Point b = new Point(1, 1);

我想检查这两个点是否在同一个地方。显而易见的方法if (a == b) { ... }不起作用,因为这似乎是“对象相等吗?”那种测试,这不是我想要的。

我可以做if ( (a.x == b.x) && (a.y == b.y) ) { ... },但这种解决方案感觉不太好。

如何以优雅的方式获取两个Point-objects并以相同的方式测试它们的相同性?

2 个答案:

答案 0 :(得分:10)

标准协议是实现equals()方法:

class Point {
  ...
  @Override
  public boolean equals(Object obj) {
    if (!(obj instanceof Point)) return false;
    Point rhs = (Point)obj;
    return x == rhs.x && y == rhs.y;
}

然后您可以使用a.equals(b)

请注意,完成此操作后,您还需要实施hashCode()方法。

对于像您这样的课程,我经常使用Apache Commons LangEqualsBuilderHashCodeBuilder

class Point {
  ...

  @Override
  public boolean equals(Object obj) {
    return EqualsBuilder.reflectionEquals(this, obj);
  }

  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
  }
}

答案 1 :(得分:0)

您需要覆盖hashCode()equals()方法。如果您正在使用Eclipse,那么您可以通过转到Source -> Generate hashCode() and equals()..让Eclipse为您执行此操作。覆盖这些方法后,您可以调用:

if(a.equals(b)) { ... }