2012-01-20 43 views
8

Si tengo una clase Person que implementa Comparable (compara personA.height a personB.height, por ejemplo), es posible el uso deJava - compareTo y operadores

personA < personB 

como sustituto de

personA.compareTo(personB) == -1? 

¿Hay algún problema al hacer esto o debo sobrecargar a los operadores?

Respuesta

6

No hay sobrecarga del operador en Java. Probablemente proviene de un fondo de C++.

Tienes que utilizar el método compareTo.

14

No, no es posible utilizar personA < personB como sustituto. Y no puede sobrecargar operadores en Java.

Además, me gustaría recomendar el cambio de

personA.compareTo(personB) == -1 

a

personA.compareTo(personB) < 0 

Lo que tenemos ahora es probablemente funcione para su clase. Sin embargo, el contrato en compareTo() es que devuelve un valor negativo cuando personA es menor que personB. Ese valor negativo no tiene que ser -1, y su código podría romperse si se usa con una clase diferente. También podría romperse si alguien cambiara el método compareTo() de su clase a una implementación diferente, pero que sigue siendo conforme.

1

Java no tiene sobrecarga del operador , entonces, sí, hay un problema: esto no es posible.


Hay, por supuesto, unos sobrecargas construido en: el operador + funciona en tipos enteros, tipos de coma flotante, y en String s. Pero no puedes definir el tuyo.

5

No es posible, no; y Java no admite la sobrecarga del operador (además de las sobrecargas incorporadas). Por favor, en lugar de escribir == -1, debe escribir < 0. compareTo solo se requiere para devolver un valor negativo/cero/positivo, no específicamente -1/0/1.

1

No, el "<" no se compilará cuando se aplique a los objetos. Además, tenga cuidado de la prueba:

personA.compareTo(personB)==-1 

Los documentos de la API simplemente dicen que compareTo() devuelve un entero negativo cuando el objeto es menor que el objeto especificado, que no necesariamente será -1. Utilice

personA.compareTo(personB) < 0 

en su lugar.

1

No es posible, java no le da la sobrecarga del operador.
Pero una opción más OO es añadir un método en el interior persona

public boolean isTallerThan(Person anotherPerson){ 
    return this.compareTo(anotherPerson) > 0; 
} 

así que en vez de escribir

if(personA.compareTo(personB) > 0){ 

} 

puede escribir

if(personA.isTallerThan(personB)){ 

} 

en mi humilde opinión, es más fácil de leer porque oculta detalles y se expresa en lenguaje de dominio en lugar de detalles de java.

+0

+1 Estoy de acuerdo con 'isTallerThan', estaba pensando solo eso. –