2013-03-15 9 views
7

Ho una classe che rappresenta le voci di database con un attributo ID univoco. Is è OK per attuare le equals() e hashcode() metodi solo in base a questo attributoQuesto ingenuo è uguale, codice hash OK?

@Override public int hashCode() 
    { return id; 
    } 

    @Override public boolean equals(Object obj) 
    { 
    if (this == obj)     return true; 
    if (obj == null)     return false; 
    if (getClass() != obj.getClass()) return false; 
    Task other = (Task) obj; 
    if (id != other.id) 
     return false; 
    return true; 
    } 

risposta

2

In generale, sì. Se tutti gli ID sono piccoli interi consecutivi, è possibile ottenere prestazioni migliori da grandi raccolte utilizzando una funzione che distribuisce i bit più ampiamente attraverso i 32 bit disponibili. Ma questo dovrebbe funzionare altrimenti.

+0

Non 'HashMap' andare fuori del suo modo di manipolare il codice hash diventa dall'oggetto? – NPE

+0

@NPE [Sì, lo fa.] (Http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/HashMap.java#256) – matts

1

Non vedo niente di sbagliato con questo codice. Tuttavia, ci sono alcune domande su cui potresti riflettere:

  • Puoi mai avere più di un oggetto con lo stesso id?
  • La classe sarà mai sottoclassata?
+0

thx, * più oggetti con lo stesso id: sì, ma sono uguali * la classe è definitiva – mica

0

Il problema con l'utilizzo di id per stabilire l'uguaglianza è che si potrebbe voler confrontare oggetti a cui non è stato ancora assegnato un id agli oggetti che hanno id. In tal caso, i metodi equals e hashCode devono utilizzare i campi aziendali che rendono l'oggetto univoco (la "chiave aziendale").

Anche confrontando la classe invece di utilizzare le regole di instanceof fuori la sottoclasse, come dice NPE.

Questo codice è tollerabile, non è il mio modo preferito di fare le cose. Per i casi semplici è eccessivo, i metodi hashCode e equals definiti da Object svolgeranno il lavoro. Per i modelli di dominio più avanzati è inadeguato, poiché la sottoclasse e i confronti per chiave aziendale saranno effettivamente utili.

0

Hai detto nei commenti che la classe è definitiva, poi vorrei suggerire è uguale disegno come in Integer.equals

public boolean equals(Object obj) { 
    if (obj instanceof Integer) { 
     return value == ((Integer)obj).intValue(); 
    } 
    return false; 
} 
Problemi correlati