2012-04-02 53 views
3

我是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对象并以一种优雅的方式测试它们是否相等,协调一致?

+0

一个很好的起点是读取JDK中已存在的代码。 – 2012-04-02 13:28:03

回答

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

当使用'instanceof'时,你不需要'null'检查,如果它的参数是'null'它只返回'false'。 – Neet 2012-04-02 13:23:06

+0

@RenéJeschke:公平点。 – NPE 2012-04-02 13:24:04

+0

谢谢,这是一种魅力。我只是想知道如果我不得不在重载的'hashCode()'中做一些奇怪的事情,或者如果像这样做:'return(this.x * 1000)+(this.y * -1000)' 。 x和y都在0-500之间,永不消极。 – bos 2012-04-02 13:46:07

0

你想覆盖hashCode()equals()方法。如果您使用的是Eclipse,那么您可以通过访问Source -> Generate hashCode() and equals()..来为您做这件事。在覆盖这些方法之后,您可以调用:

if(a.equals(b)) { ... } 
相关问题