在一个实现了一个扩展Iterable接口的java类中,如何实现equals?在实现可扩展Iterable的接口的java类中等于实现?
接口
public interface MyInterface extends Iterable<String> {
...
}
具体类
public class MyClass implements MyInterface {
private Set<String> myStrings = new HashSet<String>();
@Override
public Iterator<String> iterator() {
return myStrings.iterator();
}
@Override
public boolean equals(Object otherObject) {
我应该如何检查这两个实例和其它实例包含了一组字符串?简单的方法将只检查等于这个实现而不是界面,但这听起来像是作弊。
if (otherObject instanceof MyClass) { ... } // easy, just myStrings.equals(...)
但
if (otherObject instanceof MyInterface) { ... } // compare two iterators?
还是我失去了一些东西?我也必须实现hashCode,如果两个对象相同,不应该他们的哈希码相同,因此等于只能检查MyClass来满足这个合同?!
}
}
作为集合是无序的,有这种方法的一个无序版本实验? –
不在Guava图书馆(我知道)。我有自己的Guava附加组件,它实现了containsAll,它遍历一个迭代器并在另一个迭代器上调用Iterables.contains。使用上面描述的Set机制可能会更高效。 –
我还创建了一个containsAllAndOnly,它使用Iterables.size检查每个Iterable的大小是否相同,然后调用containsAll。 –