2011-07-26 15 views
5

int compare (Objeto o1, Objeto o2) Compara sus dos argumentos para ordenar.Comparador de interfaz Java estático compare

Para comparar 2 objetos O1 y O2 necesitan hacer algo como:

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

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

¿Por qué esto no methtod estática? Si método era estática como sea posible:

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

La respuesta de Jon es correcta, pero su punto es bueno. En teoría, sería útil si todas las clases comparables tuvieran un método de "comparación" estático, pero no hay forma de imponer eso a través de una interfaz. –

Respuesta

8

Si fuera estática, como no podía ser llamado polimórfica? El punto de Comparator es que puede pasar una instancia en algo como sort ... que tiene que llamar al método de comparación en la instancia de comparación.

Si una clase es capaz de comparar una instancia de a otro, se debe implementar Comparable lugar, por lo que escribiría:

if (o1.compareTo(o2)) 
2

Su pregunta muestra una falta de comprensión de Comparable y Comparator .

A Comparator es capaz de comparar otros dos objetos;

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

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

algo que es Comparable es capaz de ser comparado con otros objetos;

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

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

Es muy raro comparar un comparador, por lo que su ejemplo;

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

realmente no tiene sentido. De todos modos, en la respuesta, ¿por qué no está compareTo() estático? Básicamente, Comparator es una interfaz, y las interfaces no pueden tener métodos estáticos. ¿Por qué? Bueno, no tiene sentido para ellos. Una interfaz se trata de definir un contrato, pero no proporciona ninguna implementación.

1

La respuesta de John está bien a menos que sean posibles los punteros nulos. Si desea admitir punteros nulos, una opción es definir un método estático en alguna clase de 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); 
}