【发布时间】:2016-01-27 16:16:35
【问题描述】:
假设有一个数据服务返回类 cat 的实例:
class Cat {
int id;
String name;
int iq;
}
我想将实例保存在 Set<Cat> 中,该实例不得包含具有相同 ID 的两只猫。所以我需要重写equals 和hashcode 方法只检查id。
我的问题是,当我从服务接收到具有相同 ID 但 name 和/或 iq 的值不同的新实例时,如何检测我的集合中的猫是否需要更新?我无法将属性添加到 equals 或 hashcode,因为这样 Set 可能会保存相同 id 的实例。
我是否必须手动比较所有字段,或者是否有另一种 Java 典型的解决方案?
编辑澄清:
仅使用新实例更新Set 是不够的,因为更新时会触发代码。所以我想做的是:
if (set.contains(newCat)) {
Cat current = set.get(newCat);
if (!current.equals(newCat)) { //obviously this is not enough
set.add(current);
//notify EventBusses and such
}
}
我想到的解决方案是:
current.requiresUpdate(newCat) //basically copy of equals() with propertiescurrent.updateWith(newCat) //same as above but keeping the old instanceif (!current.name.euqals(newCat.name)) //for each property- 仅从服务中获取已更改的对象。最佳,但超出了我的范围。
所有这些都需要一些冗余代码,这就是为什么我希望有一个模式或集合可以为我工作。
解决方案可以包括 Guava 类。
【问题讨论】:
-
您真的不希望集合中不包含两只具有相同 ID 的猫,还是不希望两只猫具有相同的 ID?如果是前者,请使用
Map<Integer, Cat>,并在添加之前检查是否为map.containsKey(id)。 -
您可以将所有实例保存在
Map<Integer, Cat>中,而不是Set<Cat>。然后你仍然可以让你的equals()方法检查猫是否相同。或者只是编写一个不同的方法来比较所有字段。实际上,无论如何你都必须这样做。