2011-10-05 19 views
5

Questa è la mia implementazione della classe equals per una classe Coor che contiene solo 2 ints x e y. questo sarebbe il modo corretto di implementare questo metodo?Implementazione del metodo equals in java

public boolean equals(Object obj) { 
     if (obj == null || obj.getClass() != this.getClass()) { 
      return false; 
     } 
     Coor temp = (Coor) obj; 
     if (temp.x == this.x && temp.y == this.y) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
+2

Sì. Se tutti i campi sono uguali, e questo è ciò che intendi per "uguale", allora hai reso il metodo corretto. Questo non funzionerà se stai confrontando qualcosa che eredita dalla classe corrente ('this'), ma funzionerà se lo sono. – bdares

+1

non dimenticare di sovrascrivere la funzione hashcode se desideri utilizzarlo in Collections (anche se dietro le schermate) –

risposta

7

si potrebbe aggiungere un assegno di più per l'uguaglianza riflessiva (pari a sé):

public boolean equals(Object obj) { 

    // Reflexive equality: did I get passed myself? 
    if(this == obj){ 
     return true; 
    } 

    if (obj == null || obj.getClass() != this.getClass()) { 
     return false; 
    } 

    Coor temp = (Coor) obj; 
    return temp.x == this.x && temp.y == this.y; 
} 
+0

potresti spiegare che cosa "questo == obj" sta effettivamente confrontando ?, sta solo controllando se si tratta dello stesso oggetto? – user979490

+1

Posizione di memoria degli oggetti. –

+1

Controlla i 2 riferimenti oggetto ('this' e' obj') per vedere se puntano alla stessa posizione di memoria. Se lo fanno, sono lo stesso oggetto. – Pat

5

Sì, lo sarebbe.

Assicurati inoltre di sovrascrivere il metodo hashCode(): non eseguire mai l'override di uno senza fare l'altro, ma confonderà le tue raccolte.

Il tuo caso potrebbe usare un hash dove si sposta semplicemente uno dei int 32 bit e lo aggiunge l'altro la creazione di un lungo completamente unico (una funzione di hash perfetta in questo caso - collisioni)

+0

ho intenzione di leggerlo perché non ho idea di cosa sia haseCode() o cosa ma grazie per il suggerimento – user979490

3

sembra ok . Per brevità, si può fare:

return temp.x == this.x && temp.y == this.y 

Invece di

if (temp.x == this.x && temp.y == this.y) { 
     return true; 
    } else { 
     return false; 
    } 

Inoltre, si prega di tenere presente Contratto Object (sul serio!).

vedere la risposta accettata qui: What issues should be considered when overriding equals and hashCode in Java?

questo può risparmiare un enorme su di mal di testa nel futuro.

1

Check this out:

http://www.javapractices.com/topic/TopicAction.do?Id=17

Se questo articolo è troppo nel dettaglio, poi la breve di esso è: L'implementazione è corretta, ma è necessario tenere a mente alcune altre cose:

  1. Dovrai anche implementare hashCode.

  2. equals non comunicheranno più l'identità dell'oggetto. Non sembra che sia un problema per te.

  3. È possibile aggiungere l'annotazione @ Override al metodo di equals.

0

Ecco un modo più semplice:

public boolean equals(Object other) { 
    return other instanceof Coor 
     && ((Coor) other).x == x 
     && ((Coor) other).y == y 
} 
0

Credo che questo dovrebbe funzionare, ad una rapida occhiata. Dico questo perché:

  1. Gestisce bene i tipi null/errati.
  2. L'esecuzione di x.equals (y) produce lo stesso risultato di y.equals (x).
  3. L'esecuzione di x.equals (x) restituisce true.
  4. Esecuzione di x.equals (y) == true e y.equals (z) == true implica che x.equals (z) == true

Questa domanda è stata sicuramente posta molte volte prima però. Vedi qui: Overriding equals and hashCode in Java. Un libro chiamato Java efficace discute questo argomento in modo molto dettagliato, e il particolare capitolo è collegato fuori da lì.

0

C'è solo una fonte da leggere per come sovrascrivere equals e hashCode: chapter 3 di "Effective Java" di Joshua Bloch.

Se hai un buon IDE, come IntelliJ, genererà uguali e hashCode nel modo giusto per te.

Problemi correlati