2011-07-26 164 views
5

int compare(Object o1,Object o2) 比較它的兩個參數的順序。Java接口比較器靜態比較

對於比較兩個對象O1和O2需要做這樣的事情:

MyClass o1=new MyClass(); 
MyClass o2=new MyClass(); 

if (o1.compare(o1,o2)>0) ...... 

爲什麼這個methtod不是一成不變的? 如果方法是靜態的可能,如:

if (MyClass.compare(o1,o2)>0) .... 
+0

喬恩的回答是對的,但你的觀點是好的。從理論上講,如果每一個可比較的類都有一個靜態的「比較」方法,但是沒有辦法通過一個接口強制執行這個方法,那將是很方便的。 –

回答

8

如果它是靜態的,怎麼會多態叫什麼名字? Comparator的要點在於,您可以將實例傳遞到類似sort ...之類的位置,然後必須在比較實例上調用比較方法

如果一個類是能夠比較本身到另一個實例,它應該實現Comparable代替,所以你會寫:

if (o1.compareTo(o2)) 
2

你的問題顯示了缺乏ComparableComparator理解。

A Comparator能夠比較兩個其他對象;

MyClass o1 = new MyClass(); 
MyClass o2 = new MyClass(); 
MyComparator c1 = new MyComparator(); 

if (c1.compare(o1, o2) > 0) { 
    ... 
} 

東西是Comparable能夠被相對於其他對象;

MyClass o1 = new MyClass(); 
MyClass o2 = new MyClass(); 

if (o1.compareTo(o2)) > 0) { 
    ... 
} 

這是比較比較比較罕見,所以你的例子;

if (o1.compare(o1, o2) > 0) { 
    ... 
} 

確實沒有意義。無論如何,在答案中,爲什麼不是compareTo()是靜態的?基本上,Comparator是一個接口,接口不能有靜態方法。爲什麼?那麼,這對他們沒有意義。一個接口是關於定義一個合同,但沒有提供實現。

1

約翰的答案很好,除非空指針是可能的。如果你想支持空指針,一個選項是在一些Util類上定義一個靜態方法

// null pointers first 
public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2) 
{ 
    return v1 == null ? (v2 == null ? 0 : -1) : v2 == null ? 1 : v1.compareTo(v2); 
} 
// null pointers last 
public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2) 
{ 
    return v1 == null ? (v2 == null ? 0 : 1) : v2 == null ? -1 : v1.compareTo(v2); 
}