在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>