2012-01-20 14 views
8

Se ho una classe Person che implementa Comparable (confronta personA.height a personB.height, per esempio), è possibile l'utilizzoJava - compareTo e gli operatori

personA < personB 

come un sostituto per

personA.compareTo(personB) == -1? 

Ci sono problemi nel fare questo o devo sovraccaricare gli operatori?

risposta

6

Non c'è sovraccarico dell'operatore in Java. Probabilmente vieni da uno sfondo C++.

È necessario utilizzare il metodo compareTo.

14

No, non è possibile utilizzare personA < personB come sostituto. E non puoi sovraccaricare gli operatori in Java.

Inoltre, io consiglierei di cambiare

personA.compareTo(personB) == -1 

a

personA.compareTo(personB) < 0 

quello che hai ora probabilmente funziona per la classe. Tuttavia, il contratto su compareTo() restituisce un valore negativo quando personA è inferiore a personB. Questo valore negativo non deve essere -1 e il tuo codice potrebbe rompersi se usato con una classe diversa. Potrebbe anche interrompersi se qualcuno dovesse cambiare il metodo compareTo() della tua classe con un'implementazione diversa, ma ancora conforme.

1

Java non ha sovraccarico dell'operatore , quindi, sì, c'è un problema: questo non è possibile.


Ci sono, naturalmente, alcuni sovraccarichi costruito in: l'operatore + funziona su tipi interi, tipi di virgola mobile, e String s. Ma non puoi definire il tuo.

5

Non è possibile, no; e Java non supporta l'overloading dell'operatore (oltre ai sovraccarichi integrati).

A proposito, invece di scrivere == -1, è necessario scrivere < 0. compareTo è necessario solo per restituire un valore negativo/zero/positivo, non specificamente -1/0/1.

1

No, lo "<" non verrà compilato quando applicato agli oggetti. Inoltre, fare attenzione del test:

personA.compareTo(personB)==-1 

La documentazione API semplicemente dire che compareTo() restituisce un intero negativo quando l'oggetto è inferiore dell'oggetto specificato, che non sarà necessariamente -1. Utilizzare

personA.compareTo(personB) < 0 

invece.

1

Non è possibile, java non fornisce il sovraccarico dell'operatore.
Ma un più un'opzione OO è quello di aggiungere un metodo all'interno persona

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

così invece di scrivere

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

} 

è possibile scrivere

if(personA.isTallerThan(personB)){ 

} 

IMHO è più leggibile perché nasconde dettagli ed è espresso nella lingua del dominio piuttosto che nelle specifiche java.

+0

+1 Sono d'accordo con 'isTallerThan', stavo pensando proprio questo. –