Java: после добавления 2 идентичных объектов в набор, он содержит 2 элемента - PullRequest
6 голосов
/ 06 января 2012

После добавления двух идентичных объектов в набор я ожидаю, что набор будет содержать только один элемент.

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

Я считаю два объекта идентичными, если они имеют одинаковый идентификатор (String).

Другая странная вещь: ни Foo.equals, ни Foo.hashcode не доступны, насколько я могу судить, используя debug / breakpoints. Чего мне не хватает?

1 Ответ

15 голосов
/ 06 января 2012
public int hashcode() {
        return this.getId().hashCode();
    }

должно быть

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

Аннотация могла бы рассказать вам об орфографической ошибке.

В вашей среде IDE также должен быть (пропущен) маленький треугольный символметод, чтобы указать, реализуется ли интерфейс или переопределен родительский метод.

...