Мне нужно реализовать метод equals () для Предмета, который может быть помещен в хешсет его Создателя. Предмет может иметь поля, как показано ниже
class Item{
private String isbn;
private String name;
private double price;
...
}
class Maker{
private String name;
private Set<Item> items;
public Maker() {
super();
items = new HashSet<Item>();
}
...
}
Если я реализую равенства, сравнивая три поля и напишу hashCode (), основанный на этих полях, я получу неправильные результаты, когда
1.add item to hashset
2.modify the price of item
3.try to find if item exists in hashset
@Override
public boolean equals(Object o){
if(o == this){
return true;
}
if (!(o instanceof Item)){
return false;
}
Item a = (Item)o;
if(hasSameName(a) && hasSameIsbn(a) && hasSamePrice(a)){
return true;
}
else{
return false;
}
}
@Override
public int hashCode(){
int hash = 41 + this.isbn.hashCode();
hash = hash*41+ new Double(this.price).hashCode();
hash = hash*41 + this.name.hashCode();
return hash;
}
...
Set<Item> items = new HashSet<Item>();
Item item1 = new Item();
item1.setName("crystal bird");
item1.setIsbn("1111");
item1.setPrice(120.5);
items.add(item1);
System.out.println(items.contains(item1));//returns true
item1.setPrice(177.0);
System.out.println(items.contains(item1));//returns false
Как решить эту проблему? Должен ли я сделать hashCode () зависимым только от isbn и предположить, что он не изменится в течение срока службы элемента.
Любая помощь приветствуется
знак.