2012-01-06 13 views
6

Después de agregar dos objetos idénticos a un conjunto, esperaría que el conjunto solo contuviera un elemento.Java: después de agregar 2 objetos idénticos a un conjunto, contiene los 2 elementos

public void addIdenticalObjectsToSet(){ 
    Set<Foo> set = new HashSet<Foo>(); 
    set.add(new Foo("totoro")); 
    set.add(new Foo("totoro")); 
    Assert.assertEquals(1, set.size());   // PROBLEM: SIZE=2 
} 

private class Foo { 
    private String id; 
    public Foo(String id) { 
     this.id = id; 
    } 
    public String getId() { 
     return id; 
    } 
    public boolean equals(Object obj) { 
     return obj!= null && obj instanceof Foo && 
      ((Foo)obj).getId().equals(this.getId()); 
    } 
    public int hashcode() { 
     return this.getId().hashCode(); 
    } 
} 

que considerar dos objetos idénticos como si tienen el mismo identificador (String).

Otra cosa extraña: Ni Foo.equals ni Foo.hashcode se acceden, por lo que puedo decir usando puntos de depuración/corte. ¿Qué me estoy perdiendo?

+2

intente utilizar la anotación @Override –

+2

Intente aplicar @Override en los métodos que cree que están anulados –

Respuesta

15
public int hashcode() { 
     return this.getId().hashCode(); 
    } 

debería ser

@Override 
public int hashCode() { 
     return this.getId().hashCode(); 
    } 

La anotación le habría dicho acerca de la falta de ortografía.

También debe haber un pequeño triángulo (que falta) en su IDE en el método para indicar si se está implementando una interfaz o se ha anulado un método principal.

+0

+1: Similar al uso de 'compareto' en lugar de' compareTo'. Hay un método 'hashcode' en Java 6 JDK;) –

+0

¡Bien, muchas gracias! Recordaré siempre usar @Override. –

+0

Creo que FindBugs también habría entendido esto. Algo sobre la implementación 'igual' pero no' hashCode'. – Thilo

Cuestiones relacionadas