如何检查价值平等?

bos*_*bos 3 java

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

我有一节课:

class Point {
  public int x;
  public int y;

  public Point (int x, int y) {
    this.x = x;
    this.y = y;
  }
}
Run Code Online (Sandbox Code Playgroud)

我创建了两个实例:

Point a = new Point(1, 1);
Point b = new Point(1, 1);
Run Code Online (Sandbox Code Playgroud)

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

我能做到if ( (a.x == b.x) && (a.y == b.y) ) { ... },但那个解决方案并不好.

我怎样才能以优雅的方式获取两个Point-objects并以平等的方式测试它们的相同性?

NPE*_*NPE 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;
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,一旦完成此操作,您还需要实现该hashCode()方法.

对于像你这样的班,我经常使用的Apache Commons Lang中EqualsBuilderHashCodeBuilder:

class Point {
  ...

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

  @Override
  public int hashCode() {
    return HashCodeBuilder.reflectionHashCode(this);
  }
}
Run Code Online (Sandbox Code Playgroud)