2015-05-27 219 views
-1

我看明白了這個看似矛盾:爲什麼Comparator.compare需要兩個參數?

Comparator.compare接受兩個對象作爲輸入參數,並對它們進行比較,沒有做任何事情或連接到this。爲什麼它不是一個靜態的方法?

Comparator.equals將另一個對象作爲輸入參數,並將其與this進行比較。

爲什麼設計範例有差異?爲什麼compare只需要一個Object參數並將其與此進行比較?

+4

因爲接口不'static'方法的工作。你無法在任何地方用'static'' compare'方法注入一個'Comparator'。 –

+0

只回答第2段中的問題。圍繞它有一個更大的問題 – amphibient

+0

Comparator.equals用於檢查此比較器(其中您正在定義equals方法)是否等於任何其他比較對象 – Arjit

回答

2

Comparator.equals()的實現將是Object.equals()的覆蓋,並且它應該在Comparator本身比較另一個Comparator。因此,它與Comparator.compare()無關,它應該比較另一種類型的兩個對象。

查看Chetan Kinger對靜態部分的回答。

+1

爲什麼不比較只是要求一個對象參數,並將其與此比較? – amphibient

+2

@amphibient那裏有'Comparable'。 –

+2

因爲這就是「Comparable」的目的,它應該由能夠與其他對象進行比較的對象來實現。沒有這種能力的對象或者可以用不同方式進行比較的對象可以將其比較「外包」爲「比較器」。 –

0

比較器允許給定類的無限數量的可能實現。這使您可以按照多種不同的標準對列表進行排序。

假設您有員工列表。你可以在比較器上按薪水排序,而另一個按名稱排序。

equals()方法從Object中覆蓋。這種設計允許類實現者指定兩個實例將被視爲相等的唯一一種方式。請注意,爲特定用作比較器的類重寫equals()會有點不尋常。

0

雖然Sotirios的答案是正確的,但比較器也是一個比較「事物」(兩個對象)的外部「工具」,因此將比較器引用到自身(「this」引用)沒有任何意義。設想一個比較器是一對尺度:它不會自我測量,而是兩個不同的對象權重。

對於「this」引用,您必須實現與內置對象「equals」更類似的另一個接口Comparable。

0

爲什麼它不是一個靜態方法?

A static方法不能被覆蓋。如果Comparator中的compare方法是靜態的,那麼實現Comparator的類將無法定義它們自己的比較策略。此外,static方法不會真的成爲Comprator接口合同的一部分。 (Java的8允許接口具有靜態方法)

爲什麼並不比只要求單個對象參數,並將它比較 這個

一個Comparator的目的是爲了讓你定義一個或多個比較策略,而不是一個班級的自然比較策略。理想情況下,Comparator必須由與定義比較策略的類不同的類來實現。因此,Comparator取決於它定義比較策略的類的參考this是沒有意義的。如果您想爲班級定義自然比較策略,則可以改爲執行ComparableComparable有一個compareTo方法,它在this上運行,因此只有一個參數。

0

Comparator.compare將兩個對象作爲輸入參數並對它們進行比較,而不是對此做任何事情。爲什麼它不是一個靜態的方法?

它可能是靜態的,但這會阻止您將比較函數作爲參數傳遞給其他函數。因爲函數不是Java中的一等公民,所以你必須用一個接口來包裝這個單一函數,以使它可以通過。

Comparator.equals將另一個對象作爲輸入參數並將其與此進行比較。 爲什麼設計範例有所不同?爲什麼不比較只需要詢問一個對象參數並將其與此進行比較?

equals方法如果看到如果當前比較等於一些其它比較器,而不是用於比較任意對象。

1

等於將此比較器與另一個比較器進行比較。 比較涉及通用參數類型的兩個值。

假設您將自己的比較API與靜態功能。然後你可以傳遞一個Java 8「函數」。

myCollection.mySort(MyComparator::compare); 

那麼這將是很難做出參數化的比較,比如有一些額外的標準。靜態字段在多線程系統中是不可行的。

你可能喜歡但是比較組合中的java 8生成器模式,

Comparator<Employee> fullNameComparator = 
     Comparator.comparing(Employee::getLastName) 
        .thenComparing(Employee::getFirstName); 
employees.sort(fullNameComparator); 
相關問題