Loading ...

Ridefinire i metodi equals e hashCode in Java

Ridefinire i metodi equals e hashCode in Java

Per il progetto della libreria scritto in Java, 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 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.

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!