[英]Using intermediate array for hashCode and equals
由於經常在兩個地方處理班級的結構變化,這很痛苦:
class A {
class C{}
class B{}
private B bChild;
private C cChild;
private Object[] structure() {
return new Object[]{bChild, cChild};
}
public int hashCode() {
Arrays.hashCode(structure());
}
public boolean equals(Object that) {
//type check here
return Arrays.equals(this.structure(), ((A)that).structure());
}
}
除了基元裝箱外,這種方法還有什么不好? 可以改善嗎?
這是重用庫方法的聰明方法,通常這是一個好主意。 但是它確實做了很多多余的分配和數組操作,這在這種常用方法中可能效率極低。 總而言之,我會說它很可愛,但是不會通過任何評論。
在JDK 7中,他們添加了java.util.Objects類。 它實際上以提醒您編寫內容的方式實現了哈希和equals實用程序。 關鍵是該方法實際上已由JDK開發人員批准。 歐內斯特·弗里德曼·希爾(Ernest Friedman-Hill)有一點要說,但在大多數情況下,我認為不值得為了節省可讀性而節省過多的機器指令。
例如:hash實用程序方法實現為:
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
熟悉代碼的人將很難看到正在發生的事情。 正如我以前的錯誤答案所表明的那樣,它沒有列出各個字段“那么明顯”。 的確,“等式”通常是通過傳入的“對象”來實現的,因此值得商but,但是輸入是在引用等式檢查之后進行轉換的。 這里情況不同。
一種改進可能是將數組存儲為私有數據成員,而不是使用structure方法創建它,這會犧牲一點內存以避免裝箱。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.