2012-04-02 76 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)) { ... }