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

Wei*_*Shi 7 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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我想要这样的另一种.equals()方法

public boolean equals(Object o){
    return A==o.A;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ers 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
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是,使用Java Collections API无法告诉集合使用equals除上述方法之外的自定义计算或子类化和重写equals().

编辑:

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