Home / Programmazione / Java / Ridefinire i metodi equals e hashCode in Java
Mattepuffo

Ridefinire i metodi equals e hashCode in Java

Ridefinire i metodi equals e hashCode in Java

Per il progetto della libreria mi è capitato di dover ridefinire i metodi equals e hashCode.

Il primo, come si può capire dal nome stesso, serve per controllare l'uguaglianza tra due oggetti.

Questo metodo è legato all'altro, così che se viene ridefinito uno deve essere ridefinito anche l'altro.

Questo perchè l'uguaglianza si basa appunto su un codice hash, che viene trovato dal metodo hashCode.

Detto ciò vi posto tutta la classe:

public class Author {

private int id;
private String name;

public Author(String name) {
this.name = name;
}

public Author(int id, String name) {
this.id = id;
this.name = name;
}

public int getId() {
return id;
}

@Override
public String toString() {
return name;
}

@Override
public boolean equals(Object obj) {
if (!(obj instanceof Author)) {
return false;
}
Author a = (Author) obj;
return this.name.equals(a.toString());
}

@Override
public int hashCode() {
int hash = 3;
hash = 59 * hash + (this.name != null ? this.name.hashCode() : 0);
return hash;
}
}

E' una classe che rappresenta la tabella autori nel mio db (la stessa cosa l'ho fatta sugli editori).

A noi interessano gli ultimi due metodi.

 

Come vedere ho fatto l'Override di entrambi.

In equals prima controllo se obj è un'istanza dell'oggetto che mi interessa (in questo caso Author).

In caso affermativo il metodo ritorna il controllo del nome con quello dell'Autore a.

Essendo equals un metodo che restituisce un boolean, ritornerà true se trova una corrispondenza; false se non la trova.

Nel secondo invece calcoliamo l'hash dei parametri che vogliamo noi (in questo caso del nome).

Se il nome non è null il metodo ritorna il suo hashCode, che verrà poi usato da equals.

Questo è stato utile nel FormModifica del mio programmino per fare in modo che le JComboBox fossero riempite totalmente da db, ma selezionassero il nome dell'autore preso dalla colonna della JTable.

Prendendo in esame gli autori

private void fillAuthorCombo() throws SQLException, ClassNotFoundException, IOException {
ArrayList<Author> list = dbman.fillAuthor();
for (Author model : list) {
comboAuthor.addItem(model);
}
int tmp = list.indexOf(new Author(author));
comboAuthor.setSelectedIndex(tmp >= 0 ? tmp : 0);
}

Prima riempio la JComboBox con i dati presi dal db (dbman.fillAuthor()), riempiendo un ArrayList<Author>.

Poi nelle ultime due righe cerco l'occorrenza della stringa author che arriva dal JFrame principale (nell specifico dalla JTable; comunque è una stringa), e se la trova seleziona la voce esatta.

Da notare questo:

int tmp = list.indexOf(new Author(author));

Qui non gli passo direttamente la stringa author, ma un oggetto Author con la stringa che mi serve, usando il costruttore con un parametro.

Se non avessi ridefinito quei due metodi, questo non avrebbe funzionato!