hashCode()
En Java si es vol utilitzar una classe i Collections (Map, Set, …) cal definir els mètodes equals() i hashCode().
class Node<K, V> {
private K key;
private V value;
private Node<K, V> next;
@Override
public int hashCode() {
int result = key != null ? key.hashCode() : 0;
result = 31 * result + (value != null ? value.hashCode() : 0);
result = 31 * result + (next != null ? next.hashCode() : 0);
return result;
}
@Override
public boolean equals(Object x) {
if (x==null) return false;
if (x.getClass() != this.getClass()) return false;
Node<K,V> other= (Node<K,V>)x;
if (other.key!=null && this.key==null) return false;
if (other.value!=null && this.value==null) return false;
return this.key.equals(other.key) && this.value.equals(other.value);
}
}
Sempre s’ha de complir que
- si A.equals(B) => B.equals(A)
- si A.equals(B) => A.hashCode() == B.hashCode()
Però en canvi no cal que
- A.hashCode() == B.hashCode() => A.equals(B)
Per tant public int hashCode() { return 1; } també seria correcte tot i que molt ineficient !
Una altra solució és utilitzar les eines que proporcionen els IDE.
I encara una altra solució és utilitzar les biblioteques d’Apache o Lombock:
https://projectlombok.org/features/Data
import lombok.AccessLevel;
import lombok.Setter;
import lombok.Data;
import lombok.ToString;
@Data
public class DataExample {
private final String name;
@Setter(AccessLevel.PACKAGE) private int age;
private double score;
private String[] tags;
}