2012-01-06 6 views
6

Dopo aver aggiunto due oggetti identici a un Set, mi aspetto che il set contenga solo un elemento.Java: Dopo aver aggiunto 2 oggetti identici a un Set, contiene i 2 elementi

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(); 
    } 
} 

Considero due oggetti identici se hanno lo stesso id (stringa).

Altra cosa strana: non si accede a Foo.equals né a Foo.hashcode, per quanto posso dire usando il debug/breakpoint. Cosa mi manca?

+2

tenta di utilizzare @Override anotation –

+2

Prova ad applicare @Override sui metodi che si pensa vengano sovrascritti –

risposta

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

dovrebbe essere

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

L'annotazione ti avrebbe raccontato l'errore di ortografia.

Ci dovrebbe anche essere un (simbolo) piccolo triangolo nel proprio IDE sul metodo per indicare se un'interfaccia è in fase di implementazione o un metodo genitore sovrascritto.

+0

+1: simile all'utilizzo di 'compareto' invece di' compareTo'. C'è un metodo 'hashcode' in Java 6 JDK;) –

+0

Bello, grazie mille! Ricorderò di usare sempre @ Override. –

+0

Penso che FindBugs avrebbe anche preso questo. Qualcosa sull'implementazione di 'equals' ma non' hashCode'. – Thilo

Problemi correlati