這並不是那麼容易,這比你想象的更多的陷阱。
您的equals方法必須允許擁有屬於您正在編寫它的類以外的類的對象。你所要做的就是檢查是否該參數是也是一對:
if (otherObject == null) return false;
if (otherObject.getClass() != Pair.class) return false;
後該檢查通過,你可以安全地轉換,並指定投對象到一個新的局部變量:
Pair otherPair = (Pair)otherObject;
然後使用otherPair上的字段進行等號檢查。此時,您已完成otherObject參數,其餘的equals方法不應再引用它。
整個事情看起來像
public boolean equals(Object otherObject) {
if (otherObject == null) return false;
if (getClass() != otherObject.getClass()) return false;
Pair otherPair = (Pair)otherObject;
return otherPair.fst.equals(this.fst) && otherPair.snd.equals(this.snd);
}
假設FST和SND不允許爲空。在空成員上調用equals方法將導致NullPointerException。爲了避免NPE如果FST或SND爲空,檢查成員對他們的呼籲平等之前是空的:
public boolean equals(Object otherObject) {
// check if references are the same
if (this == otherObject) return true;
// check if arg is null or something other than a Pair
if (otherObject == null) return false;
if (getClass != otherObject.getClass()) return false;
Pair otherPair = (Pair)otherObject;
// check if one object's fst is null and the other is nonnull
if (otherPair.fst == null || this.fst == null) {
if (otherPair.fst != null || this.fst != null) return false;
}
// check if one object's snd is null and the other is nonnull
if (otherPair.snd == null || this.snd == null) {
if (otherPair.snd != null || this.snd != null) return false;
}
// each member is either null for both or nonnull for both
return ((otherPair.fst == null && this.fst == null) || otherPair.fst.equals(this.fst))
&& ((otherPair.snd == null && this.snd == null) || otherPair.snd.equals(this.snd));
}
這最後一位是討厭寫,集成開發環境會產生這個東西給你。以下是Eclipse生成的內容:
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Pair other = (Pair) obj;
if (fst == null) {
if (other.fst != null)
return false;
} else if (!fst.equals(other.fst))
return false;
if (snd == null) {
if (other.snd != null)
return false;
} else if (!snd.equals(other.snd))
return false;
return true;
}
還記得實施hashCode。
你爲什麼使用'otherObject'而不是'aPair'? –