Aquí hay una variación de algunas de las otras soluciones propuestas:
public abstract class CommandOverridingEquals implements Command {
public abstract boolean equals(Object other);
public abstract int hashcode();
}
Map<String, CommandOverridingEquals> map =
new HashMap<String, CommandOverridingEquals>();
O si realmente quiere estar seguro, utilice un HashMap comprobado; p.ej.
Map<String, CommandOverridingEquals> map = Collections.checkedMap(
new HashMap<String, Command>(),
String.class, CommandOverridingEquals.class);
Pero no importa lo que hagas no se puede detener a alguien haciendo esto:
public class AntiFascistCommand extends CommandOverridingEquals {
public boolean equals(Object other) { return super.equals(other); }
public int hashcode() { return super.hashcode(); }
...
}
tiendo a pensar que este tipo de cosas va a causar problemas en la pista. Por ejemplo, supongamos que tengo un montón de clases de comando existentes que amplían alguna otra clase base, y (por cierto) anulan equals
y hashcode
de la manera prescrita. El problema es que no puedo usar esas clases. En cambio, me veo obligado a volver a implementarlos o a escribir un montón de envoltorios.
IMO, es una mala idea tratar de forzar al desarrollador a un patrón de implementación particular. Sería mejor poner algunas advertencias fuertes en los Javadocs y confiar en los desarrolladores para hacer lo correcto.
Es posible que desee agregar un resumen 'hashCode', solo para completarlo. – McDowell
Muy bien ... editado en consecuencia – skaffman
funcionan como un amuleto, y de hecho, además ya tenía una clase base abstracta ... por lo tanto, no es una gran refactorización. Gracias –