他の提案されたソリューションのいくつかのバリエーションを次に示します。
public abstract class CommandOverridingEquals implements Command {
public abstract boolean equals(Object other);
public abstract int hashcode();
}
Map<String, CommandOverridingEquals> map =
new HashMap<String, CommandOverridingEquals>();
または、本当に確認したい場合は、チェック済みのハッシュマップを使用してください。例えば
Map<String, CommandOverridingEquals> map = Collections.checkedMap(
new HashMap<String, Command>(),
String.class, CommandOverridingEquals.class);
しかし、あなたが何をしても、誰かがこれをするのを止めることはできません:
public class AntiFascistCommand extends CommandOverridingEquals {
public boolean equals(Object other) { return super.equals(other); }
public int hashcode() { return super.hashcode(); }
...
}
こういうことでトラブルが発生するのではないかと思いがちです。たとえば、他の基本クラスを拡張し、(偶然に)規定の方法でオーバーライドする既存のコマンドクラスがたくさんあるequals
とします。hashcode
問題は、それらのクラスを使用できないことです。代わりに、私はそれらを再実装するか、ラッパーの束を書くことを余儀なくされています。
IMO、開発者を特定の実装パターンに強制しようとするのは悪い考えです。Javadocにいくつかの強力な警告を入れて、開発者に正しいことを任せるほうがよいでしょう。