比较两个Pair<?,?>
的正确方法是什么?
我使用此代码,但我不是百分之百确定吗? 你可能知道另一个更好的解决方案吗?
public boolean equals(Object other) {
if (other instanceof Pair<?,?>) {
Pair<?, ?> otherPair = (Pair<?, ?>) other;
return equalsPart(this._first, otherPair._first) && equalsPart(this._second, otherPair._second);
}
return false;
}
public boolean equalsPart(Class<?> one, Class<?> two) {
return ((one== two || (one!= null && two != null && one.equals(two))));
}
答案 0 :(得分:1)
public boolean equals(Object other) {
if(this == other)
return true;
if (!(other instanceof Pair)) {
return false;
}
Pair<?, ?> otherPair = (Pair<?, ?>) other;
return Equality.equals(this.first,otherPair._first) &&
Equality.equals(this._second, otherPair._second);
}
class Equality{
public static boolean equals(Object first, Object second){
return first == null ? second == null : first.equals(second);
}
}
你会发现equals()
的许多图书馆都遵循这种习惯用法。 equals()
的前提条件检查和快速失败方法。
创建了一个新的实用工具Equality
,用于进一步的课程,提高了可读性,并提供了正确的null
检查。
答案 1 :(得分:1)
我相信以下是对此的准确解决方案。由于Java和OP都没有提供Pair<?, ?>
的定义,因此我在下面列出了the class I actually use的完整定义。该代码包含hashCode
的完整性定义。
public class Tuple2<T1, T2> {
private final T1 item1;
private final T2 item2;
public Tuple2(T1 item1, T2 item2) {
this.item1 = item1;
this.item2 = item2;
}
public final T1 getItem1() {
return item1;
}
public final T2 getItem2() {
return item2;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
else if (!(obj instanceof Tuple2<?, ?>)) {
return false;
}
Tuple2<?, ?> other = (Tuple2<?, ?>)obj;
return Tuple.equals(this.item1, other.item1)
&& Tuple.equals(this.item2, other.item2);
}
@Override
public int hashCode() {
int hash = 5;
hash = 79 * hash + (this.item1 != null ? this.item1.hashCode() : 0);
hash = 79 * hash + (this.item2 != null ? this.item2.hashCode() : 0);
return hash;
}
}