为Java中的类实现2种Equals方法

时间:2011-06-16 20:32:41

标签: java

public class Foo{
    private final int A;
    private final int B;
    public boolean equals(Object o){
        //type check omitted
        return A==o.A && B==o.B;
    }

}

我希望有另一个.equals()方法,就像这样

public boolean equals(Object o){
    return A==o.A;
}

首先使用A,B字段创建Foo对象,然后我想将它们发送到使用第二个equals()方法的Set<E> 仅比较字段A

我知道我可以创建只有A字段的新对象,但开销会很大。有什么建议吗?

4 个答案:

答案 0 :(得分:6)

使用合成,您可以创建一个FooWrapper类,该类提供equals的自定义实现,并将其添加到集合中:

public class FooWrapper {
    public final Foo foo; //constructor omitted

    public boolean equals(Object other) {
         //type check omitted here too
         return foo.A == other.foo.A;
    }

    //hashCode omitted, but you need that too
}

不幸的是,使用Java Collections API无法告诉集合使用除上述方法之外的自定义equals计算或子类化和覆盖equals()

编辑:

让我感到震惊的是,您可以使用Map<Integer, Foo>来代替,使用foo.A作为关键字,使用foo作为值(从而将其限制为唯一值A)。如果没有更多的背景,我无法告诉你这是否合适。

答案 1 :(得分:0)

Object只能有一个equals实现,因为它覆盖了java.lang.Object的继承方法。我认为你需要决定Foo的平等意味着什么 - 是唯一重要的领域;如果是这样的话就是这样。您可以选择包装Foo并为equals对象提供自定义WrappedFoo方法。然后,您可以将WrappedFoo存储在Set

从设计的角度来看,这里听起来应该有两个对象 - 一个是A的值类,另一个是B的值类。如果需要一个Object来表示A和B,可以使用合成

答案 2 :(得分:0)

我为此编写了一个匹配框架:

基本接口是Matcher(类似于Comparable): http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/Matcher.html

MatchableObject是一个类,它将匹配策略应用于Object: http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/MatchableObject.html

Matchers是一个用于包装/解包MatchableObjects的实用程序类: http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/util/Matchers.html

该库是开源的。也许你发现它很有用。

主页:

http://www.softsmithy.org

下载:

http://sourceforge.net/projects/softsmithy/files/softsmithy/

的Maven:

<dependency>  
    <groupid>org.softsmithy.lib</groupid>  
    <artifactid>lib-core</artifactid>  
    <version>0.1</version>  
</dependency>  

答案 3 :(得分:0)

如果替代equals方法仅适用于此特定集合,我建议使用TreeSet(或其他SortedSet)而不是HashSet,以便您可以使用TreeSet(Comparator)构造函数。