Bonjour,

Au sein d'un programme je voudrais utiliser les classes Observable et Observer de Java afin de mettre à jour automatiquement des fichiers lorsque certains objets sont mis à jour (modifié donc).

Le problème est que j'ai mis une trace (System.out.println) en début de fonction 'update' de l'observer, mais le prog tourne sans jamais passer dans cette méthode...

Voici pour cela l'organisation de mes classes :

- Une classe XmlParser : chargée de parser un fichier xml et de construire des objets XmlTag au fur et à mesure. Cette classe comporte notemment un object XmlTagsWriter chargé d'écrire un objet XmlTag dans un fichier lorsque ce dernier est créé ou modifié.

- Une classe XmlTagsWriter qui implémente la classe Observer et qui possede donc une méthode 'update' qui appelle une méthode d'écriture pour sauvegarder les informations contenue dans un objet XmlTag

- Une classe XmlTag qui étends la classe Observable. La méthode 'notifyObserver' est appelée dans chacun des setters de cet objet afin d'écrire les nouvelles informations dans un fichier chaque fois que l'instance de l'objet est modifiée.

Lorsque je créé un nouvel objet XmlTag au sein de ma méthode de parsing de la classe XmlParser, je lui associe un objet (unique et instancié au début de la classe XmlParser) XmlTagsWriter (Observer donc) de la facon suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
	XmlTag myXmlTag = new XmlTag();
	myXmlTag.addObserver( getXmlTagsWriter() );
Voici les appels à 'notifyObservers()' dans chacun de mes setters de la classe XmlTag :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
public class XmlTag extends Observable {

        ...

	public void setParameterList(LinkedList theList) {
		parameterList = theList;
		notifyObservers();
	}

}
Et pour finir ma méthode 'update' (simplifiée) de XmlTagsWriter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
public class XmlTagsWriter implements Observer {
 
        ...
 
	public void update(Observable o, Object arg) {
 
		System.out.println("Update");
 
		if ( o instanceof XmlTag && isBigFileMode() ){
			XmlTag myXmlTag = (XmlTag) o;
			try{
				writeObject(myXmlTag, myXmlTag.getFileName());
			}
			catch ( JpDvdException je ){
			}
		}
 
	}
 
}
Je ne vois pas pourquoi la méthode 'update' de l'observer dans mon cas n'est jamais appelée !? J'ai déjà utilisé ce système pour un programme de statistique et ça marchait très bien je dois dire, mais dans ce cas là j'avais alors un seul objet Observable pour un Observer, tandis que dans le cas présent, j'ai environ 25000 objets Observable pour un seul Observer.
Peut etre cela vient-il de là ? Je ne pense pas car le programme passerai au moins une première fois dans la méthode update lors de la création du premier tag xml.

Je suis un peu perdu j'avoue, est-ce qu'un adepte du système Observer / Observable pourrait m'aider ?

Merci à lui d'avance