2010-04-16 4 views
2

J'ai une interface et deux objets implémentant cette interface, massivement simplifiés;Comparaison de deux objets implémentant la même interface pour l'égalité/équivalence - Aide à la conception

public interface MyInterface { 
    public int getId(); 
    public int getName(); 
    ... 
} 

public class A implements MyInterface { 
    ... 
} 

public class B implements MyInterface { 
    ... 
} 

Nous émigrons d'utiliser une mise en œuvre à l'autre, mais je dois vérifier que les objets de type B qui sont générés sont équivalentes à celles de type A. Plus précisément, je veux dire que pour toutes les méthodes d'interface un objet de type A et type B retournera la même valeur (je vérifie juste mon code pour générer ces objets est correct).

Comment vous y êtes-vous pris? Je recherche de bonnes pratiques de codage et de style ici. J'apprécie que je puisse juste itérer à travers un ensemble de clés tirant sur les deux objets qui devraient être équivalents et ensuite appeler toutes les méthodes et comparer, je pense juste qu'il peut y avoir une façon plus propre et plus extensible et je suis intéressé d'apprendre quelles options il pourrait y avoir.

Serait-il approprié/possible/conseillé d'outrepasser égal ou implémenter comparable?

Merci à l'avance,

Gavin

Répondre

2

je voudrais mettre en œuvre une version personnalisée de equals dans la classe de test, pas à l'intérieur l'une de ces classes de mise en œuvre (car il serait en contradiction avec le contrat equals régulier). Quelque chose comme:

boolean equals(A a, B b) ... 

Je comprends que cette vérification serait nécessaire que pendant la période de migration, de sorte que les méthodes normales equals de chaque mise en œuvre ne devrait pas être affecté. A savoir, A.equals ne doit renvoyer que true pour une instance égale de A et doit toujours renvoyer false pour une instance de B. Et vice versa. Une fois la migration terminée, vous n'avez plus besoin de la classe A ni de la classe testeur, et vous pouvez continuer à utiliser la classe B sans avoir à toucher à son implémentation.

Notez que si MyInterface (ou A et B) étend Comparable, vous devez également tester que les mises en œuvre dans A et B sont équivalentes.

(Et vous savez sûrement que si vous implémentez equals vous devez également mettre en œuvre hashCode.)

+0

fantastique, cela me fait sens, je vais écrire le code comme un test et les mises en œuvre hors garde de l'équation. Vous avez raison de dire que ce code ne sera utilisé que pendant la migration. – gav

Questions connexes