本文介紹了這等于合法嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我遇到了這段代碼。我從來沒有見過Equals以這樣的方式實現。讓我印象深刻的是,它真的很”整潔”,從這個意義上說,它只需要一行樣板。
然而,我以前從未見過這種方法,這讓我產生了懷疑。根據Java Equals和hashCode的合同,以下實現合法嗎?
@Override
public boolean equals(Object o)
{
return this == o || o instanceof DetailsPageTrackingRequest
&& this.hashCode() == o.hashCode();
}
@Override
public int hashCode()
{
//java.util.Objects
return Objects.hash(pageTrackingRequest, searchId, productId);
}
推薦答案
由于其他答案中已經說明的原因,這可能不是一個好主意。
至于”法律”方面,Contract of Object.equals說明
Equals方法在非空對象引用上實現等價關系:
它是自反式的:對于任何非空的引用值x,x.equals(X)應返回True。
它是對稱的:對于任何非空的引用值x和y,當且僅當y.equals(X)返回True時,x.equals(Y)才應返回True。
它是可傳遞的:對于任何非空的引用值x、y和z,如果x.equals(Y)返回True,y.equals(Z)返回True,則x.equals(Z)應返回True。
它是一致的:對于任何非空的引用值x和y,多次調用x.equals(Y)將一致返回True或一致返回False,前提是對象上的等于比較中使用的信息未被修改。
對于任何非空引用值x,x.equals(空)應返回FALSE。
逐步:
自反式:是的,由于this == o
對稱:由于使用了instanceof
,我們需要查看所有超類和子類以確保
傳遞性:取決于對稱要求,否則為是
一致:是
x.equals(null)
應返回FALSE:是,由于instanceof
因此,從純粹的法律角度來看,這取決于繼承層次結構中的其他實現是否違反了對稱性和傳遞性–請參閱Any reason to prefer getClass() over instanceof when generating .equals()?的答案。
除此之外,考慮到hashCode
不需要為非等價實例生成不同的值,這通常不是定義相等的好方法。
示例:
具有兩個字段的不可變點類x
和y
class Point {
final int x;
final int y
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
->有2^32 * 2^32 = 2^64
個不同的狀態,但只有2^32
個可能的哈希碼。這意味著,根據equals
的實現,有許多點被視為相等。
另請參閱此示例equals and hashCode: Is Objects.hash method broken?,了解有關使用Objects.hash
和Strings
創建的散列的散列沖突的問題。
這篇關于這等于合法嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,