2010-09-07 51 views
9

有一個Java bean對象已經實現了基於特定標準(標準A)的函數equals。我有要求根據另一個標準來識別唯一的對象(標準B)。由於equals函數使用標準A,因此我不能使用HashSet。所以我想用TreeSet與我的自定義Comparator這是基於標準B.我的問題是,是否允許這樣做?這種方法的任何問題?TreeSet和等於函數

謝謝。

回答

14

下面是從Oracle Java的一些指南:

注意,由 組(無論是否提供了明確的 比較器)保持的順序必須是 與equals一致,如果它是 正確實現Set界面。 (見相當或比較爲一致的 精確的定義與 平等的。)這是因爲Set 接口在 等於操作定義的,但TreeSet 實例執行所有的鍵比較 使用它的compareTo(或者比較) 方法,因此通過該方法被認爲相等的兩個密鑰從該集合的立場來看是相等的。如果它的排序與 相等,則集合的行爲甚至可以定義爲 ;它只是不服從Set接口的 一般合同。

我覺得就技術而言,不,你沒有任何問題。但是,在編碼,可讀性和可維護性方面,您必須小心,因爲其他人可能會誤用或誤解您正在做的事

1

如果您經常執行搜索並很少添加元素,請考慮將它們保存在List排序方式標準B和使用Collections.binarySearch

1

你可以用它們:

class BeanWrapper { 

... 

public boolean equals(Object other) { 
    return myBean.critB.equals(((Bean)other).critB); 
} 

} 

,並把它們在一組這樣的。