51 votes

Forcer une classe à remplacer la méthode .equals

J'ai un tas de classe qui met en œuvre une politique de l'interface de Commande.

Et ce tas de classe va à une Carte.

Pour obtenir la Carte fonctionne correctement, j'ai besoin de chaque classe qui implémente la Commande pour remplacer l' Object.equals(Object other) méthode.

c'est la fin.

Mais je doit forcer l'annulation d'égal à égal. => Avoir une erreur de compilation quand quelque chose qui mettent en œuvre une commande de ne pas les surcharger d'égal à égal.

C'est possible ça ?

Edit : BTW , j'aurai aussi besoin de forcer le remplacement de hashcode...

83voto

skaffman Points 197885

Non, vous ne pouvez pas. Ce que vous pouvez faire, cependant, est d'utiliser une classe de base abstraite au lieu d'une interface, et de faire equals() abstrait:

abstract class Command {
   // put other methods from Command interface here

   public abstract boolean equals(Object other);
   public abstract int hashCode();
}

Les sous-classes d' Command doit alors fournir leur propre equals et hashCode méthodes.

C'est généralement une mauvaise pratique pour forcer les utilisateurs de l'API pour étendre une classe de base, mais il peut être justifié dans ce cas. Aussi, si vous faites Command d'une classe de base abstraite au lieu d'une interface, plutôt que sur l'introduction artificielle de la classe de base en plus de l'interface de Commande, alors il n'y a pas de risque de votre API utilisateurs de se tromper.

17voto

Pierre Points 15256

Pouvez-vous étendre vos objets à partir d'un XObject abstrait plutôt que java.lang.Object?

 public abstract class XObject
 extends Object
{
@Override
public abstract boolean equals(Object o);
}
 

4voto

Philippe Gioseffi Points 312

Les classes abstraites ne fonctionneront pas si vous avez un petit-enfant puisque son père a déjà surchargé les méthodes equals et hashCode. Votre problème est donc à nouveau résolu.

Essayez d’utiliser les annotatins et APT ( http://docs.oracle.com/javase/1.5.0/docs/guide/apt/GettingStarted.html ) pour y parvenir.

1voto

NT_ Points 1944

Cela ne sera possible que si la Commande a été une interface ou une classe abstraite, où est égale à(..) est une méthode déclarée abstraite.

Le problème est que l'Objet, qui est la classe mère de tous les objets, définit déjà cette méthode.

Si vous souhaitez indiquer que c'est un problème (au moment de l'exécution), vous pouvez jeter une exception, pour forcer les utilisateurs de votre API) pour le remplacer. Mais il n'est pas possible au moment de la compilation, au moins à ma connaissance.

Essayez de le contourner, par le fait d'avoir une API spécifique à la méthode, par exemple CommandEquals. L'autre option est (comme indiqué) étendre une autre classe qui définit un est Égal à la méthode abstraite.

1voto

Nikolay Ivanov Points 5117

Eh bien, si vous voulez une vérification à l'exécution, vous pouvez faire quelque chose comme:

     interface Foo{

}
class A implements Foo {

}
class B implements Foo {
	@Override
	public boolean equals(Object obj) {
		return super.equals(obj);
	}
}

public static void main(String[] args) {
	Class<A> clazzA = A.class;
	Class<B> clazzB = B.class;

	Class<Object> objectClass = Object.class;
	try {
		Method methodFromObject = objectClass.getMethod("equals",Object.class);
		Method methodFromA = clazzA.getMethod("equals",Object.class);
		Method methodFromB = clazzB.getMethod("equals",Object.class);
		System.out.println("Object == A" + methodFromObject.equals(methodFromA));
		System.out.println("Object == B" + methodFromObject.equals(methodFromB));
	} catch (SecurityException e) {
		e.printStackTrace();
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
	}
}
 

Imprimera vrai pour le premier et faux pour le second. Si vous voulez que le temps de compilation ressemble à la seule option est de créer une annotation et d’utiliser un outil de traitement d’annotation pour vérifier que toutes les classes annotées sont égales.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X