2012-01-06 31 views
6

Sau khi thêm hai đối tượng giống hệt vào một Tập, tôi mong đợi tập hợp chỉ chứa một phần tử.Java: Sau khi thêm 2 đối tượng giống hệt vào Tập, nó chứa 2 phần tử

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

Tôi xem hai đối tượng giống hệt nhau nếu chúng có cùng id (Chuỗi).

Điều lạ lùng khác: Không truy cập Foo.equals hoặc Foo.hashcode, theo như tôi có thể nói bằng cách sử dụng gỡ lỗi/điểm ngắt. Tôi đang thiếu gì?

+2

cố gắng sử dụng @Override anotation –

+2

Thử áp dụng @Override trên các phương pháp mà bạn cho rằng bị ghi đè –

Trả lời

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

nên

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

Các chú thích sẽ nói với bạn về những lỗi chính tả.

Cũng phải có một biểu tượng hình tam giác nhỏ (thiếu) trong IDE của bạn trên phương pháp để cho biết liệu giao diện đang được triển khai hay phương thức cha mẹ bị ghi đè.

+0

+1: Tương tự như sử dụng 'so sánh' thay vì' compareTo'. Có một phương thức 'hashcode' trong Java 6 JDK;) –

+0

Rất tốt, cảm ơn rất nhiều! Tôi sẽ nhớ luôn sử dụng @Override. –

+0

Tôi nghĩ FindBugs cũng sẽ bắt được điều này. Một cái gì đó về việc thực hiện 'equals' nhưng không phải' hashCode'. – Thilo

Các vấn đề liên quan