2011-11-14 4 views
11

Tenir compte que j'ai un haricot Java standard: dire qu'il contient des membres qui sont String, List, HashMap, etc.Détecter si un objet Java a été modifié?

Ma question est: quelle est la meilleure façon de détecter si une instance d'un tel objet a été modifié de dire un état précédent/original? La raison pour laquelle je veux savoir ceci est si je détermine si je devrais mettre à jour l'objet dans le DB, ou pas, dans le cas où: (i) aucun changement n'a été fait, ou (ii) des changements ont été faits mais puis inversé.

Je pensais à la comparaison de hashCode, ou byte [], mais cela ne semble pas fonctionner. Des idées?

+0

Cela fait un moment - peut-être pourriez-vous accepter une réponse? – Bohemian

Répondre

4

Si vous avez des setters, notifiez une liste d'écouteurs dans ce setters si une nouvelle valeur est définie.

+0

Comme addittion dans ce très vieux fil pour aider les autres à venir de Google: Cela ne fonctionne pas car un "null" -change ne serait pas détecté, par exemple. setString ("newString") + setString (oldValue) ne changerait rien mais en suivant votre méthode vous obtenez une alerte positive – alex

+0

@alex Oui, c'est en quelque sorte juste. Mais c'est une question de définition. Après avoir appelé 'setString (" newString ")' l'état de l'objet a définitivement changé, il peut donc être valide de notifier un écouteur. Peut-être que vous voulez persister l'objet à chaque fois qu'il change? Que vous changiez la chaîne à l'ancienne valeur éventuellement à l'avenir, peut être important. Mais ce n'est pas nécessaire. C'est une question de votre cas d'utilisation. –

+0

Bien sûr, l'objet a changé. Mais j'avais pensé que certaines applications notifieraient un changement d'état, bien que l'état d'origine soit déjà restauré. Par définition une manipulation a été faite mais ce n'est pas logique/utile de détecter une modification dans ce cas pour toutes les situations – alex

4

Le même problème avait hibernate développeurs, et ils ont traité en créant des proxies pour les entités retournées. Le proxy enregistre chaque appel de setter et ainsi détermine si l'entité a changé.

7

Oui, cela peut être fait, et a été fait ... cela s'appelle hibernate. Utilisez simplement cela et ne "réinventez pas la roue"

+1

Pourriez-vous donner un petit détail à ce sujet ou une référence plus spécifique de n'importe quel site. –

2

Puisque vous utilisez les conventions JavaBeans, il vaudrait mieux que vos setters mettent à jour un drapeau s'ils sont appelés avec un argument différent de la cible valeur actuelle du champ. Si vous avez besoin de savoir si deux appels ou plus aboutissent à un changement réel (par exemple A-> B-> A ne change rien), alors cela devient plus complexe. Je ne suis pas sûr que ça en vaille la peine. Vous pouvez utiliser Java Persistance API (JPA), ce qui est beaucoup mieux pour ce genre de choses. Il peut également être utilisé en dehors du contexte Java EE, dans les applications Java SE simples. C'est un peu plus de travail là-bas, car vous aurez besoin de prendre soin des validations de transactions et des rollbacks, mais l'API sera très utile de toute façon.

Questions connexes