2016-10-15 34 views
0

我正在爲教育目的調查Java值對象。Java值對象定義

我不明白的是爲什麼沒有人提到(在同一時間)讓Java Value Objects實現Comparable?

如果Java值對象必須具有「正確的」HashCode &等於等同性原因,爲什麼他們不必具有Comparable CompareTo方法?

這是我的思考過程。值對象的實例將被測試爲相等,因此它們需要正確的等號/哈希碼。 值對象可以存儲在「哈希」集合中,也是哈希碼方法所需要的。那麼爲什麼不加入Comparable,以便它們可以成爲Ordered集合中的鍵?

+0

爲什麼他們必須實現'compareTo'方法? –

+0

您是否有參考資料來定義您當前使用的價值對象?然而,你的問題幾乎是這樣寫的:「爲什麼沒有定義這個概念的人包括這個概念呢」,如果不能直接質疑原作者,那麼這些問題如果不是不可能回答的話也很難。 –

回答

4

我認爲主要的原因是,對於任何值對象指定,真的有一個且只有一個平等的定義,而有可能是多種方式訂購它的實例。平等的獨特定義需要覆蓋equals()(如果默認值不足)。一旦你這樣做,就需要提供匹配的hashCode()實現,因爲文檔中引用的所有原因。

但是,您不必執行Comparable訂購值對象類的實例,而事實上你可能不應該,如果你打算給他們訂購多種方式。簡單地將匿名內聯Comparator實現傳遞給一個排序方法就足夠了,不同的比較器實現可以用於不同的排序。自Java 8和lambda以來,這比以前更容易。由於這個原因,近年來我自己已經避開實施Comparable

當然,如果真的是你特有的值對象類自然排序,然後通過各種手段實現Comparable。在這種情況下,請確保它與您的equals()實施一致。