Вот вариант некоторых других предложенных решений:
public abstract class CommandOverridingEquals implements Command {
public abstract boolean equals(Object other);
public abstract int hashcode();
}
Map<String, CommandOverridingEquals> map =
new HashMap<String, CommandOverridingEquals>();
Или, если вы действительно хотите быть уверенным, используйте проверенный hashmap; например,
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, плохая идея пытаться заставить разработчика использовать конкретный шаблон реализации. Было бы лучше поместить несколько сильных предупреждений в Javadocs и положиться на разработчиков, которые поступят правильно .