在Java中为类实现两种Equals方法

在Java中为类实现两种Equals方法,java,Java,我想要另一个类似这样的.equals()方法 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; } } Foo对象首先是用A,B字段创建的,然后我想把它们发送到一个集合,该集合使用第二个e

我想要另一个类似这样的
.equals()
方法

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;
    }

}
Foo对象首先是用A,B字段创建的,然后我想把它们发送到一个
集合
,该集合使用第二个equals()方法来仅比较字段A


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

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

public boolean equals(Object o){
    return A==o.A;
}
不幸的是,对于Java Collections API,除了上述方法或子类化和重写
equals()
之外,没有办法告诉集合使用自定义的
equals
计算

编辑:
我突然想到,您可能可以使用
Map
,而使用
foo.a
作为键,
foo
作为值(从而将其限制为
a
的唯一值)。但是,如果没有更多的上下文,我无法告诉您这是否合适。

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


从设计角度来看,这里应该有两个对象——一个是a的值类,另一个是B的值类。如果需要一个对象来表示a和B,可以使用组合。我已经为此编写了一个matcher框架:

基本接口为Matcher(类似于Comparable):

MatchableObject是一个将匹配策略应用于对象的类:

Matchers是一个用于包装/展开可匹配对象的实用程序类:

这个图书馆是开源的。也许你觉得它有用

主页:

下载:

马文:

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
}

org.softsmithy.lib
库核
0.1

如果alternate equals方法仅适用于此特定集合,我建议使用TreeSet(或另一个SortedSet)而不是HashSet,这样您就可以使用
TreeSet(Comparator)
构造函数

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