Objet Java, champs modifiés à l'écoute, design-pattern
Il existe une classe:
public class MyClass {
private String field1;
private String field2;
private String field3;
//getters, setters
}
Alors mettre à jour certains champs
MyClass myClass = new MyClass();
myClass.setField1("field1");
myClass.setField2(null);
Comment puis-je savoir quels champs de MyClass ont essayé d'être changé (invoqué, dans l'exemple ci-dessus champ1 et champ2)?
Quelle est la meilleure solution pour cela? Peut-être que certains design-pattern?
Une option consiste à créer HashSet
de champs modifiés pour cet objet comme une propriété supplémentaire et de le mettre à jour à l'intérieur de chaque setter, mais il ne semble pas agréable.
Devrait-il être quelque chose comme Proxy de l'objet qui va être intercepter tous les appels de méthode (c'est à dire setXXX()) (par l'intermédiaire de réflexion Java?) ou autre chose?
Mise à JOUR
Il semble que chaque setter doit invoquer intérieure de la méthode ce qui ne semble pas agréable comme je l'ai dit. Et je n'ai pas besoin de notifier tous les autres objets sur les changements. Je voudrais stocker tous les états de cet objet, et d'avoir accès à ces changements plus tard.
En détails: si la méthode setFieldX invoquée alors fieldX devrait être marqué pour être mis à jour plus tard
P. S. Tous les champs ont des noms différents.
D'autres solutions à l'exception de la réflexion (j'en veux pour remplir l'objet via pure setter)?
Plonus si la méthode setFieldX invoquée alors fieldX devrait être marqué pour être mis à jour plus tard.
Pourquoi voulez-vous mettre à jour plus tard? Quelle est la raison? Lorsque nous savons ce que vous voulez atteindre, nous pouvons vous aider à mieux. Dans l'exemple donné on ne voit pas pourquoi vous voulez le faire.
Plonus mise à Jour de la base de données ayant détaché de l'objet sélectionné uniquement des champs et de connaître les champs qui doivent être mis à jour.
Bender je vais essayer d'expliquer clairement. C'est Dto (pas de domaine objet). J'ai besoin de copier uniquement les champs pour objet de domaine qui ont été modifiées (à la fin de la scène). Au stade précoce, je ne veux pas stockés objet et de le comparer à elle. Je veux juste recueillir de l'information pour savoir ce qu'il faut changer plus tard. E. g. reconnaître la valeur NULLE de change et de la valeur NULL comme valeur par défaut.
OriginalL'auteur Alex | 2013-06-06
Vous devez vous connecter pour publier un commentaire.
Si vous souhaitez mettre en œuvre à l'aide de la conception classique-motif approche, je vous conseille d'utiliser Modèle Observateur
Ont un port d'écoute pour définir le champ de l'événement de votre classe
Faire une classe de mettre en œuvre cet écouteur (Observateur)
avoir une place de titulaire pour vos auditeurs dans la classe Observable (dans votre cas
MyClass
) et à chaque fois que l'ensemble de la méthode est appelée, simplement déclencher l'événement.PropertyChangeListener
)?Oui, j'étais pas au courant de cette interface. Nous pouvons utiliser la même, de toute façon, j'étais juste en expliquant le motif
Veuillez lire la mise à jour.
Merci pour l'explication.
OriginalL'auteur sanbhat
Je pense que ce que vous êtes à la recherche l'un
java.bean.PropertyChangeListener
qui est l'Observateur-Modèle en Java.Fondamentalement, vous ajoutez du code à tous les organismes de normalisation pour l'appel à la méthode dans les
PropertyChangeListener
à informer tous les observateurs que la valeur est modifiée.C'est la Java normal.
OriginalL'auteur Uwe Plonus
Sonne comme vous voulez le Observateur/Observables modèle. Fondamentalement, un état de l'écouteur de registres (observe) avec le
myClass
objet pour recevoir une notification lorsque quelque chose change.OriginalL'auteur Tim Bender
C'est difficile à dire, car nous ne savons pas pourquoi vous avez besoin de surveiller les champs et de ce dne à faire avec les changements.
Une chose que vous pourriez faire est d'ajouter des écouteurs à votre objet (modèle Observateur), de sorte que les classes, les intéressés dans les changements, pouvez être averti à ce sujet. Bien sûr, cela ne fonctionne que si vous avez accès à l'intéressé classes et pouvez les modifier en conséquence.
Si vous n'avez pas accès et n'importe qui peut appeler vos méthodes, vous pourriez avoir à passer par la réflexion. Si vous avez besoin d'une meilleure réponse, vous devez donner plus de détails.
Mise à jour
Puisque vous ne voulez en garder la trace en interne via des poseurs, alors vous pouvez simplement mettre dans votre setter, ce que vous avez besoin de garder une trace des changements. Une solution pourrait être de créer une catégorie distincte, qui stocke les modifications. Donc, chaque fois que vous faites un peu de mise à jour, vous appelez la classe de suivi et de dire les informations que vous souhaitez garder une trace de, des vieux de la valeur, la valeur à neuf, l'horodatage, que ce soit.
OriginalL'auteur Devolus