2013-10-24 50 views
2

作爲其一個痛苦的處理在兩個地方之類的結構變化我經常這樣做:使用中間陣列的hashCode和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()); 
    } 
} 

有什麼不好,除了原語的拳擊這種做法? 可以改進嗎?

+0

除了事實,即它不能編譯,你是什麼意思?到目前爲止,它沒有任何建議。 – EJP

+0

這種方法試圖解決什麼問題? – Vitaliy

+0

@Vitaliy,將對象結構封裝在兩個地方而不是三個(fields,equals,hashCode)。 – Basilevs

回答

-2

有人熟悉代碼會看到發生了什麼更難。這比列出單個字段要「不明顯」,正如我以前錯誤的答案所證明的那樣。確實,「平等」通常是通過傳入的「對象」來實現的,所以它是有爭議的,但是輸入是在引用相等檢查後進行的。這裏情況不同。

一個改進可能是將數組存儲爲私有數據成員,而不是使用結構方法創建它,犧牲一點內存以避免裝箱。

+0

這是Java,而不是C++ – Basilevs

+0

我不做C++。當我說比較內存位置的平等時,我的意思是你比較對象是否是內存中的同一個實例......佔用相同的空間,因爲它是同樣的事情。 – sdanzig

+0

-1你在這裏試圖制定的東西似乎是關於參考平等。不,在我的課堂上從不檢查參考平等。 – Basilevs

0

這是一個聰明的方式來重用庫方法,這通常是一個好主意;但是它會執行大量的額外分配和數組操作,在這些常用的方法中這可能非常低效。總而言之,我會說它很可愛,但它不會通過審查。

+0

我們可以以某種方式解決這些問題嗎?通過重用數組實例,例如? – Basilevs

+0

這會增加每個對象的內存使用量。更糟! –

+0

http://stackoverflow.com/a/27609/125562 - 高度投票的答案也使用助手對象。 – Basilevs

0

在JDK 7中,他們添加了java.util.Objects類。它實際上實現了一個哈希和等於效用的方式,提醒你寫了什麼。關鍵是這種方法實際上受到了JDK開發人員的認可。 Ernest Friedman-Hill有一點,但在大多數情況下,我不認爲額外的幾個機器指令值得以可讀性爲代價值得保存。

例如:哈希實用方法是這樣實現的:

public static int hash(Object... values) { 
    return Arrays.hashCode(values); 
} 
相關問題