IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

acceder à setChanged depuis une instance qui etend Observable dans une methode doSomething(Observable obs)


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut acceder à setChanged depuis une instance qui etend Observable dans une methode doSomething(Observable obs)
    Bonjour à tous



    J'ai une classe MaClasse qui étend Observable
    J'ai une autre classe qui contient la méthode doSomething(Observable obs) suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     public void doSomething(Observable obs){   
        obs.notifyObservers()
     }
    Je met le code de la méthode notifyObservers de la classe Observable pour que mon problème soit plus facile à comprendre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      public void notifyObservers(Object arg) {	
            Object[] arrLocal;
    
    	synchronized (this) {	
    	    if (!changed)
                    return;
                arrLocal = obs.toArray();
                clearChanged();
            }
    
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);
        }
    Comme on peut le constater si la variable changed n'est pas à true, on ne notifie pas les observers

    Or pour modifier cette variable il faut appeler la méthode suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     protected synchronized void setChanged() {
    	changed = true;
     }
    qui comme on peut le voire est protected

    Du coup depuis ma méthode doSomething je ne peux pas appeler setChanged sur mon objet MaClasse que j'ai passé en paramètre à la méthode doSomething

    J'ai bien penser à créer une class qui étend la classe Observable qui surchargerait la méthode setChanged en la rendant public et l'utiliser dans mon projet à la place de la classe Observable ...


    Mais je voudrais (en admettant que cela soit possible ... ) trouver un moyen pour éviter cela car je vais sans doute intégrer mon projet à un projet déjà existant, et si je peux éviter de me taper toutes les classes étendant la classe Observale ca serait bien cool

    Même si cette solution est compliquée et/ou longue à mettre en place ce n'est pas un problème, je préfère passer du temps sur un problème comme celui la plutôt que passer du temps à faire du copier coller pour changer les classes qui étendent Observable dans mes différents projets

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Il y a une méthode super crado mais courte et efficace : faire de l'introspection pour modifier la valeur de la variable "changed".
    Mais tu as manifestement un problème de conception. La classe est notifiée correctement. Si elle choisie d'ignorer le message, c'est son problème. Ce n'est pas à un objet extérieur de forcer le comportement interne de cette classe.

  3. #3
    Nouveau membre du Club Avatar de Hyperion99
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 62
    Points : 35
    Points
    35
    Par défaut
    Salut dinobogan,

    merci pour ta réponse et tes conseilles ....

    Le problème de conception dont tu parles est , j'aurai envie de dire , "volontaire"...
    Effectivement le modèle doit être seul à choisir s'il veut ou non notifier ses observers..
    Mais dans mon cas je réfléchissais sur un système qui permettrait de déléguer la mise à jour du modèle de vue et de la vue à un "projet externe"

    Exemple
    J'ai un projet OldProjet qui contient une vue OldVue
    Le modèle de cette vue est OldModel
    La classe OldModel contient un champs text oldChamps
    La classe OldVue contient un champ JTextField "monTextField"
    Le champs monTextField doit afficher la valeur du champs oldChamp du modèle OldModel

    Ce que j'aurai aimer faire c'est déléguer la mise à jour du champs oldChamps du mode et la mise à jour du composant monTextField de la vue à une classe externe maClasseExterne (que j'aurai créer dans un projet à part)

    Le but étant que pour des écrans basiques la personne qui développe la vue n'ai pas besoin de redéfinir les listener sur ces composant graphiques, ni de surcharger la méthode update (qui met à jour les compo graphique ) de la vue (qui étend Observable..)

    Du coup dans maClasseExterne je ne sait pas comment est implémenté le modèle de vue (en l'occurrence dans mon exemple OldModel)
    JE ne peut pas savoir si dans la méthode setOldChamps de OldModel est du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      public void setOldChamps(String valeur{
            this.oldChamps = valeur;
            this.setChanged();
        }
    Comme me l'on fait remarquer d'autre personne, on peut se dire que c'est aux personnes ayant écris la classe OldModel de penser que cela était nécessaire ou non ...

    Cependant j'imagine qu'il doit y avoir beaucoup de projet où (pour diverses raisons, genre le prototype qui devient le truc à mettre en prod ) on y a pas penser.

    Du coup je me posais la question de ce qui était le mieux : prendre en compte ce genre de projets (ma question d'origine est donc d'actualité) ou ne pas tenir compte de ce genre de projet (et ta remarque devient THE réponse

    De toutes façon, comme me l'a fait remarquer deux de mes mantors (dédicasse to Dave and M&Si ) le problème avec la classe observable c'est qu'il peut il y avoir des fuites de mémoires étant donnés que des références des objets sensés être "garbage collecté" peuvent rester référencés ...

    En suivant les conseils de mes camarades () la solution que je vais sans doute mettre en place (n'éhistez pas à me donner vos avis..) c'est que je vais créer une classe ObservableBis qui fera le même boulot que la classe Observable (même signature de méthode... ) mais qui en plus gérera les fuite de mémoire (avec des WeakReference)

    Le problème de ce système c'est que j'oblige les personnes voulant intégrer mon projet dans le leur, à changer les classe étendant Observable en étendant ObservableBis....

    Si quelqu'un a un avis (ou plus de précision, car je veux bien croire que suis peut être pas très clair .. )

    merci d'avance !
    a+

  4. #4
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Et puis marquer la classe Observable en tant que deprecated pourrait être une idée par exemple.

Discussions similaires

  1. Réponses: 1
    Dernier message: 09/02/2009, 01h36
  2. Réponses: 10
    Dernier message: 12/09/2008, 10h09
  3. Réponses: 2
    Dernier message: 02/04/2008, 19h55
  4. Réponses: 2
    Dernier message: 12/11/2007, 21h04
  5. [Syntaxe] Lien d'une frame qui s'ouvre dans une autre
    Par Petrucci dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 02/04/2007, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo