1

我正在创建一个类的子类 whereequals()hashCode()arefinal并且基于身份。(特别是带有合约的XML DOM XOM :

public final boolean equals(Object o)

    Tests for Node/Element identity. That is, two Node/Element objects 
    are equal if and only if they are the same object. 

Element是可子分类的(例如

 FooElement extends xom.nu.Element

我广泛使用它。我还开发了平等方法(例如

fooElementA.isEqualTo(fooElementB)

我想用它来创建集合和哈希图。

我无法重写 XOM 库,也无法说服作者发布该equals()方法。是否有我可以使用的通用解决方法(例如包装器、委托、子类化HashMap等)?

注意:hashCode()也是最终的。

4

2 回答 2

4

如果这是 .NET,我建议您Dictionary使用自定义IEqualityComparer<T>. 在 Java 中,尽管您需要将对象包装实现hashCodeequals.

final class FooElementWrapper {

  private final FooElement inner;
  public FooElementWrapper(FooElement inner) {
    this.inner = inner;
  }

  @Override
  public int hashCode() {
    return 0; // replace by a proper implementation!!!
  }

  @Override
  public boolean equals(Object o) {
    if(o instanceof FooElementWrapper) {
      return this.isEqualTo((FooElementWrapper)o);
    } else {
      return false;
    }
  }

}

ASet<FooElementWrapper>现在应该做这项工作。您绝对应该hashCode使用适用于FooElement.

于 2013-04-16T08:44:35.577 回答
2

您可以使用自己的比较器创建TreeSet(或TreeMap )。

Set<Element> set = new TreeSet<Element>(new Comparator<Element>() {
    @Override
    public int compare(Element e1, Element e2) {
        // Your own compare logic
    }
});

笔记

从文档

请注意,如果要正确实现 Set 接口,集合维护的顺序(无论是否提供显式比较器)必须与 equals 一致。

这意味着您没有履行 equals 方法的一般合同。

当且仅当您在文档中明确说明您正在做什么时,您才可以使用此方法。

于 2013-04-16T09:06:15.063 回答