2 votes

Comment effectuer une comparaison significative entre deux objets qui n'implémentent pas la méthode equals ?

J'écris un scénario de test dans lequel je dois comparer de manière significative deux objets qui n'implémentent pas la norme equals . Je ne veux pas écrire equals ou hashcode pour ces objets.

Existe-t-il une API qui puisse faire cela pour moi ?

5voto

dacwe Points 26160

Apache commons-lang dispose d'un constructeur automatique d'égalités - par exemple "reflection-equals". Documentation de l'API pour EqualsBilder . Notez également qu'il existe un HashCodeBuilder dans la même bibliothèque.


Exemple d'utilisation de cette bibliothèque :

static class A {
    private int a;
    private String b;
    A(int a, String b) {
        this.a = a;
        this.b = b;
    }
}

public static void main(String[] args) {
    A a1 = new A(123, "Hello World!");
    A a2 = new A(321, "Hello!");
    A a3 = new A(123, "Hello World!");

    System.out.println(EqualsBuilder.reflectionEquals(a1, a2, true));
    System.out.println(EqualsBuilder.reflectionEquals(a1, a3, true));
}

Sortie :

false
true

2voto

Mark Peters Points 42201

S'il s'agit uniquement d'un code de test, vous pouvez simplement créer une méthode d'aide pour encapsuler vos assertions :

public static void assertMyClassEquals(MyClass expected, MyClass actual) {
    assertEquals(expected.foo, actual.foo);
    //...
}

Mais je ne suis pas sûr de comprendre votre aversion pour la création d'une equals() qui pourrait évidemment être utile.

1voto

Farmor Points 4928

Oui, il existe un comparateur qui devrait parfaitement répondre à vos besoins.

Un lien vers l'API JAVA Comparateur d'interface

Et un lien vers un article de blog expliquant comment l'utiliser. Interfaces comparables et comparateurs - Partie 2

1voto

Thilo Points 108673

Parfois, la comparaison du résultat de toString est une comparaison pertinente.

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