Proprits Proprits Les proprits peuvent tre visibles dans
Propriétés
Propriétés ► Les propriétés peuvent être visibles dans les environnements de scripts ► Les propriétés peuvent être accédées par programmation par les autres composants en invoquant les accesseurs (getter and setter methods) ► Feuille de propriétés fait partie du processus de personnalisation (customization) d’un composant ► En général, les propriétés sont persistentes
Méthodes d’accès ► Les propriétés sont toujours accédées par invocation de méthodes sur les instances qui les contiennent. ► Noms § les méthodes d’accès peuvent avoir des noms arbitraires. § Par convention Property. Type get. Foo(); // simple getter void set. Foo(Property. Type value); // simple setter même si dans un éditeur de scripts permet d’écrire quelque chose du genre “b. Label = foo” il y aura invocation de méthode sur l’objet cible
La classe Livre public class Livre { // titre : propriété en lecture seulement private String titre_; public Livre(String titre) { this. set. Titre(titre); } public String get. Titre() { return this. titre_; } protected void set. Titre(String titre) { this. titre_ = titre; } }
Propriétés indexées ► Pour spécifier un indice qui identifie quelle valeur obtenir ► Les indices de propriétés doivent être de type int (Java). Property. Type getter(int index); // indexed getter Property. Type[] getter(); // array getter void setter(int index, Property. Type indexed setter void setter(Property. Type values[]); setter ► value); // // array peut déclencher une exception java. lang. Array. Index. Out. Of. Bounds. Exception
Exceptions et méthodes d’accès ► Les méthodes d’accès simples et indexées peuvent déclencher des exceptions.
Propriétés liées (bound) ► S’il existe un service de notification des changement d’une propriété bound ► Property. Change. Listener event listener § pour informer des mises-à-jour des propriétés liées simples. public void add. Property. Change. Listener (Property. Change. Listener x); public void remove. Property. Change. Listener (Property. Change. Listener x); § invocation de la méthode suivante pour chacun des a. Listener. property. Change(Property. Change. Event evt)
Propriétés liées (bound) ► La source de l’événement devrait déclencher l’événement après la mise-à-jour de son état interne. ► Classe utilitaire Property. Change. Support § pour gérer la liste des Property. Change. Listeners § pour déclencher les événements Property. Change.
Propriété liée public class Livre { private Membre emprunteur_; private Property. Change. Support property. Change. Support_ = new Property. Change. Support(this); public Livre(String titre) { this. set. Titre(titre); this. add. Property. Change. Listener(Log. Livre. get. Instance()); } public Membre get. Emprunteur() { return this. emprunteur_; } public void set. Emprunteur(Membre emprunteur) { Membre old. Value = emprunteur_; this. emprunteur_ = emprunteur; property. Change. Support_. fire. Property. Change("emprunteur", old. Value, emprunteur_); } public void add. Property. Change. Listener(Property. Change. Listener listener){ property. Change. Support_. add. Property. Change. Listener(listener); } public void remove. Vetoable. Change. Listener(Property. Change. Listener listener){ property. Change. Support_. remove. Property. Change. Listener(listener); } }
Singleton Log. Livre public class Log. Livre implements Property. Change. Listener { static private Log. Livre instance__ = null; synchronized static public Log. Livre get. Instance(){ if (instance__ == null){ instance__ = new Log. Livre(); } return instance__; } private Log. Livre() { } public void log(String msg){ System. out. println( msg ); } public void property. Change(Property. Change. Event evt) { log("événement : " + ((Livre) evt. get. Source()). get. Titre() + "propriété : " + evt. get. Property. Name() + "ancienne valeur : " + evt. get. Old. Value() + "nouvelle valeur : " + evt. get. New. Value()); } }
Propriétés contraintes ► Les propriétés sont dites contraintes lorsque d’autres beans peuvent § souhaiter valider le changement § rejeter un changement s’il est inapproprié. public Property. Type get. Foo(); public void set. Foo(Property. Type value) throws Property. Veto. Exception;
Propriétés contraintes ► Si le récepteur de l’événement ne souhaite pas que la modification soit faite il déclenche une exception Property. Veto. Exception ► la responsabilité de la source de § § § ► capturer cette exception réétablir l’ancienne valeur rapporte le retour l’ancienne valeur via un nouvel événement Vetoable. Change. Listener. vetoable. Change. La source devrait déclencher ce type d’événement avant de mettre à jour son état.
Propriétés contraintes ► Il existe une classe utilitaire Vetoable. Change. Support § pour gérer la liste des Vetoable. Change. Listeners § pour déclencher les événements Vetoable. Change § pour capturer les exceptions Property. Veto. Exceptions et émettre les événements de réversion nécessaires.
Ecouter les propriétés à la fois liées et contraintes Si un bean supporte une propriété qui est à la fois liée et contrainte alors elle devrait déclencher § un événement Vetoable. Change. Listener. vetoable. Change avant la mise-à-jour de la propriété § un événement Property. Change. Listener. property. Change après la mise-à-jour de la propriété.
Propriété contraintes public class Livre { private Vetoable. Change. Support vetoable. Change. Support_ = new Vetoable. Change. Support(this); public Livre(String titre) { this. set. Titre(titre); this. add. Vetoable. Change. Listener(Finance. get. Instance()); this. add. Property. Change. Listener(Log. Livre. get. Instance()); } public void set. Emprunteur(Membre emprunteur) throws Property. Veto. Exception { Membre old. Value = this. emprunteur_; try { vetoable. Change. Support_. fire. Vetoable. Change("emprunteur", old. Value, emprunteur_); this. emprunteur_ = emprunteur; property. Change. Support_. fire. Property. Change("emprunteur", old. Value, emprunteur_); } catch (Property. Veto. Exception e) { Log. Livre. get. Instance(). log("emprunt refusé"); throw e; } } public void add. Vetoable. Change. Listener(Vetoable. Change. Listener listener){ vetoable. Change. Support_. add. Vetoable. Change. Listener(listener); } public void remove. Vetoable. Change. Listener(Vetoable. Change. Listener listener){ vetoable. Change. Support_. remove. Vetoable. Change. Listener(listener);
Vérification des événements sans effet Si une méthode “setter” est invoquée avec un argument égal à la valeur courante de la propriété alors il est recommandé que le bean ne déclenche pas d’événement de type Vetoable. Change. Listener. vetoable. Change ou Property. Change. Listener. property. Change.
Le singleton Finance public class Finance implements Vetoable. Change. Listener { static private Finance instance__ = null; synchronized static public Finance get. Instance(){ if (instance__ == null){ instance__ = new Finance(); return instance__; } } private Finance() { } protected boolean is. Solvable(Membre m){ return this. get. Solde(m)>= 0; } protected int get. Solde(Membre m) { return 0; } public void vetoable. Change(Property. Change. Event evt) throws Property. Veto. Exception { if (evt. get. New. Value() == null) return; if ( !is. Solvable((Membre)evt. get. New. Value())) { throw new Property. Veto. Exception("emprunteur non solvable", evt); } } }
Support optionnel pour les propriétés liées void add. Property. Change. Listener (String property. Name, Property. Change. Listener listener); void remove. Property. Change. Listener (String property. Name, Property. Change. Listener listener); ► le bean doit aussi supporter le design pattern standard pour l’enregistrement des event listeners, qui ne prend qu’un seul argument. alternative void add<Property. Name>Listener(Property. Change. Listener p); void remove< Property. Name>Listener(Property. Change. Listener p);
Support optionel support pour les propriétés contraintes nommées void add. Vetoable. Change. Listener (String property. Name, Vetoable. Change. Listener listener); void remove. Vetoable. Change. Listener (String property. Name, Vetoable. Change. Listener listener); ► le bean doit aussi support le design pattern standard pour l’enregistrement des event listeners, qui ne prend qu’un seul argument. alternative void add<Property. Name>Listener(Vetoable. Change. Listener p); void remove<Property. Name>Listener(Vetoable. Change. Listener p);
Les classes de support en Java ► class java. beans. Property. Change. Event § null peut être utilisé comme ancienne et/ou nouvelle valeur si la valeur réelle n’est pas connue. § null peut être utilisé comme nom de la propriété modifiée pour indiquer qu’un ensemble arbitraire de propriétés ont été modifiées. interface java. beans. Property. Change. Listener ► class java. beans. Property. Change. Support ► § Aucun événement n’est déclenché si les anciennes valeurs sont égales et non -nulles. class java. beans. Property. Veto. Exception ► interface java. beans. Vetoable. Change. Listener ► class java. beans. Vetoable. Change. Support ►
- Slides: 20