2012-10-16 9 views
5

Esistono due metodi equivalenti?Esistono due tipi di metodo equals()

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
    } 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) 
     return false; 
    Bigram b = (Bigram) o; 
    return b.first == first && b.second == second; 
} 

confrontarli con i 2 metodi, quando vogliamo ignorare il uguale metodo, perché abbiamo bisogno di definire un metodo il cui parametro è di tipo Object è uguale!

risposta

6

V'è in realtà una buona ragione per questo:

  • è necessario il metodo di equals(Object) per ignorare la superclasse è uguale metodo java.lang.Object
  • Spesso anche vuole una equals(Bigram) metodo di overload che gestisce il caso dove il compilatore può dimostrare che il tipo è Bigram in fase di compilazione. Ciò migliora le prestazioni evitando il controllo e la trasmissione dei tipi e offre una migliore verifica dei tipi nel codice.
  • Infine, si potrebbe voler implementare gli uguali in un modo speciale per testare con l'uguaglianza con oggetti che non sono essi stessi un'istanza di Bigram. Questo dovrebbe essere usato con cautela (vuoi veramente qualcosa che non sia un'istanza di Bigram per essere considerato uguale a un Bigram?), Ma ha alcune applicazioni valide (ad esempio confrontando il contenuto di diversi tipi di oggetti di raccolta).

Normalmente tuttavia è migliore per attuare in modo che un metodo chiama l'altro, ad esempio:

public boolean equals(Bigram b) { 
    return b.first == first && b.second == second; 
} 

@Override public boolean equals(Object o) { 
    if (!(o instanceof Bigram)) return false; 
    return equals((Bigram)o); 
} 

questo modo è più conciso e significa che è necessario solo per implementare la logica test uguaglianza volta (Non ripeterti!).

2

I quadri/API che chiamano equals() metodo (come containsKey() nelle mappe, negli elenchi, ecc,) chiamare il sovrascritto equals() dalla classe Object e non la versione di overload. Quindi è necessario per definire lo public boolean equals(Object obj).