2010-12-03 65 views
3

我正在編寫一堆代碼,並發現了一些開發人員擁有實現Comparable的DTO的實例。這個DTO有7或8個字段。 CompareTo方法也僅在一個領域已經實現:我應該關注這個compareTo/equals/hashCode實現嗎?

private DateMidnight field1; //from Joda date/time library 

public int compareTo(SomeObject o) { 
    if (o == null) { 
     return -1; 
    } 
    return field1.compareTo(o.getField1()); 
} 

同樣equals方法無效,基本上可以歸結爲:

return field1.equals(o.getField1()); 

最後的hashCode方法實現:

return field1.hashCode; 

field1不應該爲空,並且在這些對象中將是唯一的(即,我們不應該得到兩個對象相同的field1)。

所以,實現是一致的,這是很好的,但我應該擔心只有一個字段被使用?這是不尋常的嗎?是否可能導致問題或混淆其他開發人員?我正在考慮這些對象的列表被傳遞並且另一個開發人員使用Map或Set somesort並從這些對象中獲取異常行爲的場景。任何想法讚賞。謝謝!

+0

在一個切線上... [Joda-Time](http://www.joda.org/joda-time/)的用戶應該注意到這個字段是一個類型([DateMidnight`]](http:///www.joda.org/joda-time/apidocs/org/joda/time/DateMidnight.html))現在已被棄用,應該避免。現在適當的類型是[`DateTime`](http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html),並且調用[`withTimeAtStartOfDate`](http ://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay--)。 – 2015-07-06 02:22:51

回答

5

我懷疑這是「首次使用勝利」的情況 - 有人需要對這些對象的集合進行排序或將它們放在哈希映射中,並且它們僅關注日期。最簡單的實現方法是按照你說的方式覆蓋equals/hashCode並執行Comparable<T>

對於專家分類,更好的方法是在不同的類中實現Comparator<T> ...但遺憾的是,Java沒有用於相等性測試的任何等價類。說實話,我認爲這是Java收藏的一個主要弱點。

假設這真的是不是「一個自然而明顯的比較」,它肯定會在設計方面聞起來...應該是非常小心的文件。

+1

是的,我認爲「首先使用勝利」是放置這種設計的好方法,爲什麼我會感到有些不舒服。你是對的,Comparator似乎更適合這裏。 – 2010-12-03 09:14:34

+2

@Chris:你完全適合對它感到不舒服。比較器更適合排序...它只是這樣的恥辱有沒有辦法做到平等:(:(在.NET中有`IEqualityComparer `這是用於此目的。) – 2010-12-03 09:26:44

1

我不認爲你需要擔心。這三種方法之間的合同是保持一致的。

無論是從正確從業務邏輯的角度來看是一個不同的問題。

如果例如field1映射到數據庫中的主鍵是非常有效的。如果FIELD1是一個人的「名字」,我會擔心

2

嚴格地說,這違反了可比規格:

http://download.oracle.com/javase/6/docs/api/java/lang/Comparable.html

注意,null不是任何類的實例,和e.compareTo(null)應該拋出NullPointerException,即使e.equals(null)返回false。

同樣,它看起來像equals方法將拋出NPE上equals(null)而不是返回false(當然,除非你「煮」出空處理代碼)。

是否可能導致問題或混淆其他開發者?

可能,可能不是。這真的取決於如何大你的項目是如何廣泛/「可重複使用」 /長住你的對象的源代碼預期使用:

  • 小型/短命/限量使用==可能不是一個問題。
  • 大/長壽命/廣泛使用==反直觀的實現可能會導致未來的問題
+2

是的,我做了「煮「out the null處理代碼的equals實現,但是由於指出缺少空指針異常的可比較的。不知道那個。 – 2010-12-03 09:17:00

2

你不應該與它有關,如果FIELD1是真正獨特。如果不是,你可能會遇到問題。無論如何,我的建議是做一些單元測試。他們應該顯示真相。

相關問題