2012-06-13 8 views
21

L'interfaccia di Comparator ha il proprio metodo equals(). Per impostazione predefinita, qualsiasi classe otterrà equals() tramite la classe Object. Qual è la necessità di avere il metodo equals() all'interno di un'interfaccia?Perché il comparatore si dichiara uguale?

+0

A volte la spiegazione è abbastanza semplice - il metodo di eguaglianza in Comparator non è stato ben concepito. Non c'è una ragione più profonda per questo. Qualsiasi ragionamento può mettere in discussione il motivo per cui migliaia di altre classi non "ridefiniscono" il contratto di uguaglianza. – hawk

risposta

3

Dal Java documentations, il motivo per cui Comparator ha il proprio equals() metodo:

Tuttavia, ignorando questo metodo può, in alcuni casi, migliorare le prestazioni consentendo programmi per determinare che due comparatori distinti impongono la stesso ordine.

+4

Sì, ma è ancora ridondante menzionare il metodo nell'interfaccia. – aioobe

+0

@aioobe bene, la tua risposta chiarisce tutti gli altri scenari. Volevo solo dire all'OP che il motivo per cui è presente nell'interfaccia è di suggerire al programmatore il miglioramento delle prestazioni, ignorando il suddetto metodo. –

2

Leggere il numero javadoc. È lì solo per spiegare cosa deve restituire equals() se si sceglie di sovrascriverlo in una classe che implementa Comparator. Potresti pensare che nessun comparatore possa essere uguale a nessun altro, ma non è così. Si potrebbe pensare che due comparatori siano uguali se restituiscono la stessa cosa per qualsiasi argomento, ma non è il caso. Il javadoc spiega che due comparatori sono uguali se impongono lo stesso ordinamento, indipendentemente dagli argomenti forniti. JavaDoc dice anche:

Si noti che è sempre sicuro di non ignorare Object.equalsQ (Object)

maggior parte del tempo, non ignorare equals() in comparatori.

0

Procedimento equals() in Comparator è previsto per costringere un utente che implementa l'interfaccia Comparator di attuare equals() con alcune regole e vincoli aggiuntivi oltre a quelli già applicati su equals() da Object.

La regola aggiuntiva essere:

Questo metodo deve obbedire al contratto generale di Object.equalsQ (oggetto). Inoltre, questo metodo può restituire true solo se l'oggetto specificato è anche un comparatore e impone lo stesso ordine di questo comparatore . Così, comp1.equals (COMP2) implica che sgn (comp1.compare (o1, o2)) == sgn (comp2.compare (o1, o2)) per ogni riferimento oggetto o1 e o2.

1

dal docs:

è sempre sicuro di non ignorare Object.equalsQ (Object). Tuttavia, il metodo che sovrascrive questo metodo può, in alcuni casi, migliorare le prestazioni consentendo ai programmi di determinare che due comparatori distinti impongono lo stesso ordine.

+1

Giusto, ma penso che la domanda fosse perché questo metodo è menzionato nell'interfaccia, poiché è semanticamente parlando ridondante. – aioobe

7

Comparator affina il contratto di Object.equals: Deve soddisfare i vincoli stabiliti dal Object.equalse poi alcuni.

Inoltre, questo metodo può restituire true solo se l'oggetto specificato è anche un comparatore e impone lo stesso ordine di questo comparatore. Pertanto, comp1.equals(comp2) implica che sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2)) per ogni riferimento oggetto o1 e o2.

Dichiarazione di un equals all'interno Comparator permette di documentare questo in forma di javadoc.

Nota che la documentazione dell'API funge anche da contratto, quindi qui non sono solo i cosmetici. Sono i vincoli espliciti su cui possono fare affidamento altri codici e il tuo codice.

In situazioni simili in cui si hanno metodi meno consolidati, può anche servire come documento di intenti. Ad esempio, Interface.method dovrebbe essere lì, indipendentemente da come si evolvono le sue superinterfacce.

+3

Non sono d'accordo.Il punto del metodo è quello di affinare il contratto del metodo dei pari per i Comparatori: quando può essere considerato uguale e quando non è possibile. Potresti pensare che nessun comparatore possa essere uguale a nessun altro, ma non è così. Si potrebbe pensare che due comparatori siano uguali se restituiscono la stessa cosa per qualsiasi argomento, ma non è il caso. Javadoc dice esplicitamente che non è necessario eseguire l'override degli uguali, perché 'Object.equals()' soddisfa il contratto. –

+1

Questa è un'osservazione valida. Alla fine però, qual è il contratto di un metodo API? La sua documentazione Quindi, alla fine, è all'incirca quello che sto dicendo, anche se non è chiaro come lo hai espresso ;-) Riformulazione leggermente. – aioobe

+2

Preferisco la tua risposta ora, ma non vedo ancora il punto del paragrafo sul "disaccoppiamento" dalla classe Object. Comparator * non * ha bisogno di questo metodo. –

1

L'inserimento di un metodo Object in una dichiarazione di interfaccia consente la dichiarazione Javadoc del significato di uguaglianza per avere in classi che implementa l'interfaccia.

+0

Dato che abbiamo implementato di default in Object, il compilatore non impone ai programmatori di implementare uguali se è presentato nell'interfaccia. Ma compare() non è definito nell'oggetto, ecco perché i programmatori devono implementarlo. – Denys

0
Comparator interface have their own equals() method 

Bene ,. Prima di tutto, dovrebbe essere chiaro che ogni volta che si implementa l'interfaccia Comparable, si dovrebbe fornire al programma di decidere quando gli oggetti sono uguali, minori o maggiori.

I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class. 

L'implementazione del metodo equals() u ereditano dalla classe Object verifica solo se i due referances puntano allo stesso oggetto oppure no. Non applica alcun confronto. Sei tu che fornirai nella tua classe (o eventualmente nella tua interfaccia) i criteri per la parità degli oggetti.

Then what is need to have equals() method inside an interface? 

Ovviamente, quando si implementa quando gli oggetti sono meno, maggiore è necessario implementare quando sono uguali. Quindi, piuttosto che basarsi su oggetti di default Equals() metodo è necessario fornire la logica per controllare l'uguaglianza

1

Tecnicamente, la dichiarazione del metodo è ridondante (il compilatore non si cura), ma ...

Dichiarare la il metodo equals in questa interfaccia lo rende parte del contratto tra il chiamante e diversi Comparators e consente di specificare/estendere la sua semantica.

Specifica che due Comparatori sono uguali solo se impongono lo stesso ordinamento con il loro metodo di confronto(). Questo estende la semantica di Object.equals() e deve quindi essere documentato nell'interfaccia.

Problemi correlati