为什么TransformedCollection没有实现hashCode?

时间:2012-08-23 14:40:53

标签: java collections guava

我希望两个相同的变换到具有相同hashCode的结果对象。我想使用这个属性检查我的对象是否有意义地改变了。

不幸的是,Guava的TransformedCollection extends AbstractCollection(与AbstractList不同)没有实现hashCode或等于,TransformedCollection本身没有这样的尝试。

  • 我们难道不能根据迭代器的顺序返回的值计算hashCode吗?
  • 或者仍然不能保证相同hashCodes
  • 也许我们可以通过TransformedCollection无法解决的方式为AbstractCollection解决此问题?

1 个答案:

答案 0 :(得分:11)

不幸的是,没有明智的方法来定义Collection.hashCode。一个集合可以是SetList(或其他内容),两者可以不兼容的方式定义hashCode

此外,出于同样的原因,transformedCollection1.equals(transformedCollection2)没有明确的定义。它可以忽略顺序,也可以不忽略(Set或List语义)。更糟糕的是,返回的Collection只是一个视图,而equals这样的效率会非常低效。

我建议使用类似ImmutableList.copyOf(transformedCollection)的内容并使用它。