J'ai besoin de comparer des dizaines de champs dans deux objets (instances de la même classe), et de faire de la journalisation et mise à jour en cas de différences. Code Meta pourrait ressembler à ceci:Quel est le meilleur moyen de comparer plusieurs propriétés javabéennes?
if (a.getfield1 != b.getfield1)
log(a.getfield1 is different than b.getfield1)
b.field1 = a.field1
if (a.getfield2!= b.getfield2)
log(a.getfield2 is different than b.getfield2)
b.field2 = a.field2
...
if (a.getfieldn!= b.getfieldn)
log(a.getfieldn is different than b.getfieldn)
b.fieldn = a.fieldn
Le code avec toutes les comparaisons est très laconique, et je voudrais faire en quelque sorte plus compact. Ce serait bien si je pouvais avoir une méthode qui prendrait comme paramètre la méthode calls to setter et getter, et l'appelle pour tous les champs, mais malheureusement ce n'est pas possible avec java.
J'ai proposé trois options, chacune ayant ses propres inconvénients.
1. Utilisez l'API de réflexion pour trouver des accesseurs
laid et pourrait provoquer des erreurs d'exécution dans les noms de cas des champs changent
2. Changer les champs pour le public et les manipuler directement sans utiliser getters et setters
laid aussi bien et exposerait la mise en œuvre de la classe à
3. Demandez la classe contenant (entité) faire la comparaison, la mise à jour changé les champs et ret message journal urne
entité ne doit pas prendre part à la logique métier
Tous les champs sont de type chaîne, et je peux modifier le code de la classe propriétaire des champs si nécessaire.
EDIT: Certains champs de la classe ne doivent pas être comparés.
Vous comparez les instances de deux classes différentes ou deux instances de la même classe? – rudolfson
Ce sont des instances de la même classe. J'ai édité la question. Merci de l'avoir signalé. – tputkonen