Guavaには、Equivalence
あなたが求めていることをほぼ実行するクラスがあります。
オブジェクトをでラップEquivalence
して、より良いhashCode()equals()実装でオブジェクトを装飾することもできます(たとえば、マップキーとして悪いequals()hashCode()を持つオブジェクトを使用したいがアクセスできない場合ソースへ)
次に例を示します。配列にはequals()とhashCode()の適切な実装がありませんが、char配列の同等性は次のとおりです。
private static final Equivalence<char[]> CHAR_ARRAY_EQUIV = new Equivalence<char[]>(){
@Override
protected boolean doEquivalent(char[] a, char[] b) {
return Arrays.equals(a, b);
}
@Override
protected int doHash(char[] chars) {
return Arrays.hashCode(chars);
}
};
サンプルコード:
final char[] first ={'a','b'};
final char[] second ={'a','b'};
Assert.assertFalse(first.equals(second));
Assert.assertFalse(first.hashCode() == second.hashCode());
final Wrapper<char[]> firstWrapped = CHAR_ARRAY_EQUIV.wrap(first);
final Wrapper<char[]> secondWrapped = CHAR_ARRAY_EQUIV.wrap(second);
Assert.assertTrue(firstWrapped.equals(secondWrapped));
Assert.assertTrue(firstWrapped.hashCode() == secondWrapped.hashCode());