6
votes

Objet Java, Écouteur de champs modifiés, modèle de conception

Il y a une classe: xxx

puis nous mettons à jour certains champs xxx

Comment puis-je savoir quels champs de myclass ont essayé de être changé (invoqué, dans l'exemple ci-dessus sur le champ1 et le champ2)?
Quelle est la meilleure solution pour cela? Peut-être un modèle de design?
Une option consiste à créer hashset de champs modifiés pour cet objet sous forme de propriété supplémentaire et à la mettre à jour à l'intérieur de chaque setter, mais cela ne semble pas agréable.
Si ce n'est quelque chose comme un objet proxy qui interceptera tous les appels de méthode (c'est-à-dire Setxxx ()) (via une réflexion Java?) Ou autre chose?

mise à jour

Il semble que chaque constructeur soit invoqué une méthode intérieure qui ne semble pas bien comme je l'ai dit. Et je n'ai pas besoin d'informer les autres objets sur les changements. J'aimerais stocker tous les états de cet objet et avoir accès à ces changements plus tard.
En détail: Si la méthode SetFieldx invoquait, alors FieldX doit être marquée pour être mise à jour ultérieure de
P.s. Tous les champs ont des noms différents.
Toute autre solution à l'exception de la réflexion (je veux peupler un objet via un séchoir pur)?


7 commentaires

Après cette mise à jour: quel est l'objectif que vous voulez réaliser?


@Uwe plonus Si la méthode Setfieldx invoquée puis FieldX doit être marquée pour être mise à jour ultérieure.


Pourquoi voulez-vous le mettre à jour plus tard? Quelle est la raison pour ça? Lorsque nous savons ce que vous voulez réaliser, nous pouvons mieux vous aider. Dans l'exemple donné, personne ne voit pourquoi vous voulez faire cela.


@Uwe Plonus Mettre à jour la base de données ayant un objet détaché pour les champs sélectionnés uniquement et savoir quels champs doivent être mis à jour également.


Hein. Je vais casser cela à votre condition de ne pas avoir de sens. Si à une date ultérieure, la pseudo-entité doit être engagée dans la base de données, elle devrait être commise dans son ensemble pour prévenir la corruption. Juste une pensée. Avez-vous entendu parler de JPA?


@ Tim Bender je vais essayer d'expliquer clairement. Ceci est DTO (pas objet de domaine). Je dois copier uniquement les champs à l'objet de domaine qui ont été modifiés (à la fin de l'étape). Au début de l'étape, je ne veux pas avoir stocké l'objet et vous comparez. Je veux juste collecter des informations pour savoir quoi changer plus tard. Par exemple. Reconnaître la valeur nulle des modifications et une valeur nulle comme valeur par défaut.


On dirait qu'un changement de change ou un journal d'audit ressemble à un DCV ou à des SGBD modernes.


4 Réponses :


2
votes

sonne comme si vous voulez le Observateur / Modèle observable . Fondamentalement, un auditeur d'état registre (observe) avec l'objet myClass pour recevoir une notification lorsque quelque chose change.


0 commentaires

2
votes

C'est difficile à dire, car nous ne savons pas pourquoi vous devez surveiller les champs et que les NED doivent être effectuées avec les modifications.

Une chose que vous puissiez faire est d'ajouter des auditeurs à votre objet (modèle d'observateur), de sorte que les classes, intéressées par les changements, peuvent être notifiées à ce sujet. Cela ne fonctionne bien sûr que si vous avez accès aux classes intéressées et que vous pouvez les modifier en conséquence.

Si vous n'avez aucun accès et que personne ne peut appeler vos méthodes, vous devrez peut-être aller par réflexion. Si vous avez besoin d'une meilleure réponse, vous devez donner plus de détails.

mise à jour

Depuis que vous voulez seulement garder une trace de celui-ci via des setters, vous pouvez simplement mettre votre séchoir, tout ce dont vous avez besoin pour suivre les changements. Une solution pourrait être de créer une classe distincte qui stocke les modifications. Donc, chaque fois que vous faites une mise à jour, vous appelez la classe Tracker et indiquez-la des informations que vous souhaitez garder une trace de, comme une valeur ancienne, une nouvelle valeur, un horodatage, peu importe.


0 commentaires

5
votes

Je pense que ce que vous cherchez sur le java.bean.propertychangelistener qui est le motif observateur en Java.

Fondamentalement, vous ajoutez du code à toutes les setters pour appeler la méthode dans le «code> Propertyhangelistener pour informer tous les observateurs que la valeur est modifiée.

C'est la voie de Java normale.


0 commentaires

8
votes

Si vous souhaitez implémenter à l'aide de l'approche conventionnelle design-motif, je vous recommanderais d'utiliser modèle d'observateur

Demandez à un auditeur pour l'événement de champ défini de votre classe p>

public class MyClass {

    List<FieldListener> listeners = new ArrayList<FieldListener>(); // the placeholder for listeners

    private String field1;
    private String field2;

    /**
     * @param field1 the field1 to set
     */
    public void setField1(String field1) {
        fireEvent("field1", field1);
        this.field1 = field1;
    }
    /**
     * @param field2 the field2 to set
     */
    public void setField2(String field2) {
        fireEvent("field2", field2);
        this.field2 = field2;
    }

    public void addListener(FieldListener l) {
        if(l != null) listeners.add(l);
    }

    public void fireEvent(String fieldName, Object newValue) {
        for(FieldListener l : listeners) {
            l.fieldValueChanged(fieldName, newValue);
        }
    }

    public static void main(String [] args) {
        MyClass m = new MyClass();
        m.addListener(new SampleObserver());
        m.setField1("s");
        m.setField2("v");
    }

}


3 commentaires

Pourquoi ne pas utiliser de classes / interfaces qui existe déjà dans l'API pour ce cas d'utilisation ( PropertyChangelistener )?


Oui, je n'étais pas au courant de cette interface. Nous pouvons utiliser la même chose, de toute façon je voulais juste expliquer le modèle


@sanbhat merci d'explication.