Patrón: objetos iguales si son iguales algunos campos

A menudo la equivalencia no tiene más ciencia que decir que dos objetos son equivalentes si lo son algunos de sus campos.

Ejemplo, sean objetos que son coches

public class Coche {

    private String marca;

    private String modelo;

    private int puertas;

    private int km;

    private Color color;

Si queremos definir como iguales dos coches con igual marca, modelo y número de puertas:

@Override

public boolean equals(Object x) {

    if (x == this) return true;

    if (x == null) return false;

    if (!(x instanceof Coche)) return false;

 

    Coche otro = (Coche) x;

    if (puertas != otro.puertas) return false;

    if (!marca.equals(otro.marca)) return false;

    if (!modelo.equals(otro.modelo)) return false;

 

    return true;

}

Si queremos tener en cuenta que alguno de los campos que son objeto pueda ser nulo:

@Override

public boolean equals(Object x) {

    if (x == this) return true;

    if (x == null) return false;

    if (!(x instanceof Coche)) return false;

 

    Coche otro = (Coche) x;

    if (puertas != otro.puertas) return false;

    if (marca == null) {

        if (otro.marca != null) return false;

    } else {

        if (!otro.marca.equals(marca)) return false;

    }

    if (modelo == null) {

        if (otro.modelo != null) return false;

    } else {

        if (!otro.modelo.equals(modelo)) return false;

    }

 

    return true;

}

Regla: si redefine equals(), debe redefinir hashCode().

Temas relacionados

63. equals (método) public boolean equals(Object)