2011-07-26 9 views
5

int compare(Object o1、Object o2) 2つの引数を比較して順序付けします。 2つのオブジェクトを比較するためにJavaインターフェイスコンパレータのstatic比較

はO1とO2のような何かを行う必要があります。

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

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

なぜこのmethtod静的ではありませんの? 方法のようなことができ、静的だった場合:それは静的であれば、どのようにそれは多態

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

Jonの答えは正しいですが、あなたのポイントは良いです。理論的には、すべての同等のクラスに静的な '比較'メソッドがある場合は便利ですが、インターフェイスを介してそれを強制する方法はありません。 –

答えて

8

と呼ばれるだろうか? Comparatorのポイントは、インスタンスsort ...のようなものに渡すことができます。これは、コンパレータインスタンスの比較メソッドを呼び出す必要があります。

クラスが別の自体の1つのインスタンスを比較することが可能であるならば、それは代わりにComparableを実装する必要があり、そうあなたが書いたと思います:

if (o1.compareTo(o2)) 
2

ご質問はComparableComparatorの理解の欠如を示しています。

Comparatorは、2つの他のオブジェクトを比較することができます。

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

nullポインターが可能でない限り、Johnの答えは正常です。ヌルポインタをサポートしたい場合は、いくつかの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); 
}