从技术上来说,设置一个地图Foo1和Foo2在技术上可能相同,但是你仍然希望它们具有不同的质量,这样:
Foo foo2 = new Foo("id1", 4);
Foo foo1 = map.get(foo2);
if(foo1 != null){
map.replace(foo1, foo1.combine(foo2));
}
这在技术上是否违反“等于”?我注意到在Multiset
中没有get
函数是有意义的,因为如果集合包含对象,那么你已经拥有它,所以不需要检索它。
但与此同时,将一个包含键和值的地图作为同一个对象似乎过度杀戮就是为什么我要调查Multiset
编辑:combine返回仍然“等于”但组合属性的相同对象。
即
public class Foo {
String id;
int length;
public combine(Foo foo){
this.length += foo.length;
return this;
}
@Override equals(Object o){
...
return this.id == that.id;
}
答案 0 :(得分:1)
Equals和hashcode具有其他类依赖的正确实现的契约。我不会滥用这些方法来解决这个问题。
更好的解决方案是拥有自定义界面
public interface MergeAble<T> {
public boolean canMerge(T other);
}
您的对象可以实现此目的,您可以使用自定义逻辑来合并在您自己的界面中实现的那些对象。