Generant un Java HashCode correcte

Taula de Continguts

Java HashCode és un dels mètodes que més mals de cap genera als programadors.

public boolean hashCode();

el mètode s’usa en combinació amb el mètode equals per comparar a nivell de negoci quan dos objectes d’una classe són idèntics. La implementació de equals sempre és molt més senzilla d’entendre.

Java HashCode

Aquest mètode existeix per millorar el rendiment de Java a l’hora de comparar dos objectes. Ja que si dos objectes tenen hashCodes diferents ja no poden ser iguals i es tracta de fer una comparació senzilla entre nombres enters. Els problemes sorgeixen en com generar els hashCodes, ja que el framework de col·leccions el fa servir per a dissenyar les estructures internes dels seus tipus abstractes de dades. En el següent exemple es mostra la classe Persona amb el mètode equals sobreescrit (override) perquè dos objectes siguin iguals si el seu nom i cognoms coincideixen. El mètode és més o menys comprensible.

package com.arquitecturajava;public class Persona {private String nombre;private String apellidos;public String getNombre() {return nombre;}public void setNombre(String nombre) {this.nombre = nombre;}public String getApellidos() {return apellidos;}public void setApellidos(String apellidos) {this.apellidos = apellidos;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Persona other = (Persona) obj;if (apellidos == null) {if (other.apellidos != null)return false;} else if (!apellidos.equals(other.apellidos))return false;if (nombre == null) {if (other.nombre != null)return false;} else if (!nombre.equals(other.nombre))return false;return true;}}

Eclipsi Java HashCode

El mètode anterior ha estat generat amb els refactorings d’Eclipse. De la mateixa manera es pot generar el hashCode.

public int hashCode() {final int prime = 31;int result = 1;result = prime * result+ ((apellidos == null) ? 0 : apellidos.hashCode());result = prime * result + ((nombre == null) ? 0 : nombre.hashCode());return result;}

Aquest mètode ja no és tan senzill d’entendre. Això és degut al fet que els hashCodes han de tenir una certa variabilitat. És a dir si tots els objectes generen el mateix hashcode (), això no valdrà per millorar el rendiment en les comparacions ja que tots generen el mateix i caldrà utilitzar sempre el mètode equals a l’hora de realitzar-les.

javaHashCode

Per l’altre costat si tots els objectes generen hashCodes diferents, serà impossible agrupar dins dels diferents tipus de col·leccions d’una forma òptima.

javaHashCodeCorrecto

Java HashCode Jocs correctes

Per aquest motiu normalment Eclipsi s’encarregui de dissenyar el seu propi mètode hashCode a través del ús de nombres primers. No obstant això hi ha una altra opció molt més elegant i senzilla per generar-los. L’API de Java disposa d’una classe Objects en el paquet d’utilitats que genera hashCodes.

@Override public int hashCode() { // TODO Auto-generated method stub return Objects.hash(nombre,apellidos); }

D’aquesta manera ens oblidarem dels embolics que aquest mètode genera en els programadors.

Altres articles relacionats: Entenent Equals i HashCode, Java == vs Equals

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *