これらのインターフェイスの値オブジェクトを実装しています。
interface FooConsumer
{
public void setFoo(FooKey key, Foo foo);
public Foo getFoo(FooKey key);
}
// intent is for this to be a value object with equivalence based on
// name and serial number
interface FooKey
{
public String getName();
public int getSerialNumber();
}
そして、私が読んだことから(たとえば、インターフェイスで「equals」を強制し、インターフェイスでtoString()、equals()、およびhashCode()で)推奨事項は、抽象基本クラスを提供することです。
abstract class AbstractFooKey
{
final private String name;
final private int serialNumber
public AbstractFooKey(String name, int serialNumber)
{
if (name == null)
throw new NullPointerException("name must not be null");
this.name = name;
this.serialNumber = serialNumber;
}
@Override public boolean equals(Object other)
{
if (other == this)
return true;
if (!(other instanceof FooKey))
return false;
return getName().equals(other.getName()
&& getSerialNumber() == other.getSerialNumber()
&& hashCode() == other.hashCode(); // ***
}
@Override public int hashCode()
{
return getName().hashCode() + getSerialNumber()*37;
}
}
私の質問は、ここで追加した最後のビットと、 が実装されているがサブクラス化されていないクラスのインスタンスであるAbstractFooKey.equals(x)
値で呼び出される状況に対処する方法です。これを処理する方法がわかりません。一方で、等価のセマンティクスは、名前とシリアル番号が等しいことに依存する必要があるように感じますが、Object.equals() の契約を満たすためには、hashCodes も等しくなければならないようです。x
FooKey
AbstractFooKey
私はすべきですか:
- 本当に怠惰で、マークされた行を忘れてください
***
- 怠けて、私が持っているものを保管してください
- オブジェクト
false
がequals()
_other
_AbstractFooKey
- 本当に厳密になり、インターフェイス FooKey を取り除き、最終的なクラスに置き換えますか?
- 他の何か?