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.

Slides:



Advertisements
Présentations similaires
La programmation orientée objet avec Java L3-MIAGE Plan
Advertisements

Evénements Java Beans Java RMI
Le mécanisme des exceptions
Introspection et Réflexion Manipulation dynamique de code Java.
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
TP 7.1 synchronized et join Écrire un programme Java qui crée 1000 threads et maintient un compteur nb du nombre de threads créés jusque-là. Le thread.
Plan du cours La sérialisation: – comment stocker et restaurer les Objets? Les interfaces graphiques et la programmation évènementielle. –Comment concevoir.
Programmer en JAVA par Tama
JAV - TD 6 Structures de données JAVA
Tarak Chaari, Stéphane Frénot, Frédérique Laforest, Frédéric Le-Mouël JAV1 JAV – TD 5 Lhéritage en Java.
Introduction à la POO: Les classes vs les objets
Connexion base de données
Principes de programmation (suite)
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
JavaBeans Réalise par: EL KHADRAOUY TARIK AOUTIL SAFOWAN.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
POO-L3 H. Fauconnier1 Chapitre IV 1. classe Object, clonage 2. interfaces 3. classes internes et imbriquées.
Écouteurs de click d'une fenêtre
Langage Oriente Objet Cours 4.
Les exceptions. Quest ce quune exception ? Une erreur dans le programme Due à un bug ou un cas « anormal » Gestion complète en java : JVM Dans dautre.
Principes de programmation (suite)
Page de garde Les JavaBeans ISIA, Mars 2003
Chapitre VII Généricité. POO-L3 H. Fauconnier2 Chapitre VII 1. Principes généraux 2. Types génériques imbriqués 3. Méthodes génériques 4. Types paramètres.
Introduction au paradigme objet Concepts importants surcharge (overload) redéfinition (override) Définition d’une classe Définition des attributs.
77 Utilisation des classes (suite). 7-2 Objectifs A la fin de ce cours, vous serez capables de : Définir des méthodes surchargées dans une classe Fournir.
DESS CCI POO-JAVA TD n°7 exercice n°1
Structures de données IFT-2000
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
Behavioral Design Patterns The Observer Pattern Roberto Demontis Sylvain Giroux.
Design Pattern Memento. Principe : Enregistrer les changements d'états d'un objet Objectif : Pouvoir restituer les états précédents d'un objet.
Design Pattern: Decorator
1 IFT 6800 Atelier en Technologies dinformation Le langage de programmation Java chapitre 3 : Classes et Objects.
COURS DE PROGRAMMATION ORIENTEE OBJET :
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Les méthodes en java • Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. • Une méthode pour être utilisée.
1111 Gestion des exceptions Objectifs À la fin de ce cours, vous serez capables de : • Expliquer les concepts de base de la gestion des exceptions.
1212 Entrée et sortie de fichiers Objectifs À la fin de ce cours, vous serez capables de : • Lire à partir de la console • Écrire sur la console.
4 Introduction des objets. Les chaînes et tableaux
1 Fichers Binaires, Accès Direct et Objets. 2 Données binaires. Il s'agit ici de lire et écrire des données binaires par opposition à du texte. Pour ce.
LIFI-Java 2004 Séance du Mercredi 22 sept. Cours 3.
Copyright © SUPINFO. All rights reserved La Programmation Orientée Objet en C# 2.0.
Cours n°3 rappels. POO-L3 H. Fauconnier2 Entrée-sortie public static void main(String[] args) { // sortie avec printf ou double a = 5.6d ; double b =
La notion de type revisitée en POO
Cours 61 6 La sécurité, Portée, Visibilité Programmer avec sécurité.
Factory Design Patterns. Contents Factory patterns: principesFactory patterns: principes The Factory Method patternThe Factory Method pattern The Abstract.
Evénements. Plan Evénements Principes Exemples Adapteur.
Cours 9 Exceptions (fin) Généricité. POO-L3 H. Fauconnier2 Chaînage d'exceptions  Une exception peut être causée par une autre.  il peut être utile.
JavaBeans.
Types Abstraits.
11/04/ L'héritage Cours 7 Cours 7.
7ième Classe (Mardi, 24 novembre) CSI2572. Devoir 3 ?
Variables et accès en Java. Déclaration des variables final transient static private Printer hp; transient => ne doivent pas être sérialisées volatile.
Cours 7 Classes locales Clonage Divers: tableaux.
Master 1 SIGLIS Java Lecteur Stéphane Tallard Chapitre 6 – Exceptions.
Tutorat en bio-informatique
12/04/ Les exceptions Cours 11 Cours 11.
Les classes présenté par: RAHMOUNE RIME / ZEKRI SELMA.
Schéma de conception Factory Method Exemple Sylvain Giroux.
C# de plus près.  Ce sont globalement les mêmes que Java : ◦ Int(int16, int32), float, double, bool,…  Les classe « communes » sont également les mêmes.
Cours du 5 novembre.
Behavioral Design Patterns The Observer Pattern. Intention Définir une dépendance de “1” à “n” entre des objets de telle sorte que lorsque l’état d’un.
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Iterator Design Pattern Alessandro Soro Sylvain Giroux.
Cours 4 (14 octobre) Héritage. Chapitre III Héritage.
Héritage Conception par Objet et programmation Java
Langage et Concepts de Programmation Orientée-Objet Pôle Informatique 2007/2008 École Nationale Supérieure des Mines de Saint-Étienne Laurent Vercouter.
Conception de Programmes - IUT de Paris - 1ère année Les classes Introduction Déclaration d’une classe Utilisation d’une classe Définition des.
LES CLASSES ET LES OBJETS
Schéma de conception Factory Method Exemple
Transcription de la présentation:

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 PropertyType getFoo(); // simple getter void setFoo(PropertyType 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 // titre : propriété en lecture seulement private String titre_; private String titre_; public Livre(String titre) { public Livre(String titre) { this.setTitre(titre); this.setTitre(titre); } public String getTitre() { public String getTitre() { return this.titre_; return this.titre_; } protected void setTitre(String titre) { protected void setTitre(String titre) { this.titre_ = 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). PropertyType getter(int index); // indexed getter PropertyType[] getter(); // array getter void setter(int index, PropertyType value); // indexed setter void setter(PropertyType values[]); // array setter ► peut déclencher une exception java.lang.ArrayIndexOutOfBoundsException

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 ► PropertyChangeListener event listener  pour informer des mises-à-jour des propriétés liées simples. public void addPropertyChangeListener (PropertyChangeListener x); public void removePropertyChangeListener (PropertyChangeListener x);  invocation de la méthode suivante pour chacun des aListener.propertyChange(PropertyChangeEvent 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 PropertyChangeSupport  pour gérer la liste des PropertyChangeListeners  pour déclencher les événements PropertyChange.

Propriété liée public class Livre { private Membre emprunteur_; private Membre emprunteur_; private PropertyChangeSupport private PropertyChangeSupport propertyChangeSupport_ = new PropertyChangeSupport(this); propertyChangeSupport_ = new PropertyChangeSupport(this); public Livre(String titre) { public Livre(String titre) { this.setTitre(titre); this.setTitre(titre); this.addPropertyChangeListener(LogLivre.getInstance()); this.addPropertyChangeListener(LogLivre.getInstance()); } public Membre getEmprunteur() { return this.emprunteur_; public Membre getEmprunteur() { return this.emprunteur_; } public void setEmprunteur(Membre emprunteur) { public void setEmprunteur(Membre emprunteur) { Membre oldValue = emprunteur_; Membre oldValue = emprunteur_; this.emprunteur_ = emprunteur; this.emprunteur_ = emprunteur; propertyChangeSupport_.firePropertyChange("emprunteur", propertyChangeSupport_.firePropertyChange("emprunteur", oldValue, emprunteur_); oldValue, emprunteur_); } public void addPropertyChangeListener(PropertyChangeListener listener){ public void addPropertyChangeListener(PropertyChangeListener listener){ propertyChangeSupport_.addPropertyChangeListener(listener); propertyChangeSupport_.addPropertyChangeListener(listener); } public void removeVetoableChangeListener(PropertyChangeListener listener){ public void removeVetoableChangeListener(PropertyChangeListener listener){ propertyChangeSupport_.removePropertyChangeListener(listener); propertyChangeSupport_.removePropertyChangeListener(listener); }}

Singleton LogLivre public class LogLivre implements PropertyChangeListener { static private LogLivre instance__ = null; static private LogLivre instance__ = null; synchronized static public LogLivre getInstance(){ synchronized static public LogLivre getInstance(){ if (instance__ == null){ instance__ = new LogLivre(); if (instance__ == null){ instance__ = new LogLivre(); } return instance__; return instance__; } private LogLivre() { private LogLivre() { } public void log(String msg){ System.out.println( msg ); public void log(String msg){ System.out.println( msg ); } public void propertyChange(PropertyChangeEvent evt) { public void propertyChange(PropertyChangeEvent evt) { log("événement : " + ((Livre) evt.getSource()).getTitre() log("événement : " + ((Livre) evt.getSource()).getTitre() + "propriété : " + evt.getPropertyName() + "propriété : " + evt.getPropertyName() + "ancienne valeur : " + evt.getOldValue() + "ancienne valeur : " + evt.getOldValue() + "nouvelle valeur : " + evt.getNewValue()); + "nouvelle valeur : " + evt.getNewValue()); }}

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 PropertyType getFoo(); public void setFoo(PropertyType value) throws PropertyVetoException;

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 PropertyVetoException ► 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 VetoableChangeListener.vetoableChange. ► 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 VetoableChangeSupport  pour gérer la liste des VetoableChangeListener s  pour déclencher les événements VetoableChange  pour capturer les exceptions PropertyVetoException s 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 VetoableChangeListener.vetoableChange avant la mise-à-jour de la propriété  un événement PropertyChangeListener.propertyChange après la mise-à-jour de la propriété.

Propriété contraintes public class Livre { private VetoableChangeSupport private VetoableChangeSupport vetoableChangeSupport_ = new VetoableChangeSupport(this); vetoableChangeSupport_ = new VetoableChangeSupport(this); public Livre(String titre) { public Livre(String titre) { this.setTitre(titre); this.setTitre(titre); this.addVetoableChangeListener(Finance.getInstance()); this.addVetoableChangeListener(Finance.getInstance()); this.addPropertyChangeListener(LogLivre.getInstance()); this.addPropertyChangeListener(LogLivre.getInstance()); } public void setEmprunteur(Membre emprunteur) throws PropertyVetoException { public void setEmprunteur(Membre emprunteur) throws PropertyVetoException { Membre oldValue = this.emprunteur_; Membre oldValue = this.emprunteur_; try { try { vetoableChangeSupport_.fireVetoableChange("emprunteur", oldValue, vetoableChangeSupport_.fireVetoableChange("emprunteur", oldValue, emprunteur_); emprunteur_); this.emprunteur_ = emprunteur; this.emprunteur_ = emprunteur; propertyChangeSupport_.firePropertyChange("emprunteur", oldValue, propertyChangeSupport_.firePropertyChange("emprunteur", oldValue, emprunteur_); emprunteur_); } catch (PropertyVetoException e) { } catch (PropertyVetoException e) { LogLivre.getInstance().log("emprunt refusé"); LogLivre.getInstance().log("emprunt refusé"); throw e; throw e; } } public void addVetoableChangeListener(VetoableChangeListener listener){ public void addVetoableChangeListener(VetoableChangeListener listener){ vetoableChangeSupport_.addVetoableChangeListener(listener); vetoableChangeSupport_.addVetoableChangeListener(listener); } public void removeVetoableChangeListener(VetoableChangeListener listener){ public void removeVetoableChangeListener(VetoableChangeListener listener){ vetoableChangeSupport_.removeVetoableChangeListener(listener); vetoableChangeSupport_.removeVetoableChangeListener(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 VetoableChangeListener.vetoableChange ou VetoableChangeListener.vetoableChange ouPropertyChangeListener.propertyChange.

Le singleton Finance public class Finance implements VetoableChangeListener { static private Finance instance__ = null; static private Finance instance__ = null; synchronized static public Finance getInstance(){ synchronized static public Finance getInstance(){ if (instance__ == null){ instance__ = new Finance(); } if (instance__ == null){ instance__ = new Finance(); } return instance__; return instance__; } private Finance() { private Finance() { } protected boolean isSolvable(Membre m){ return this.getSolde(m)>= 0; protected boolean isSolvable(Membre m){ return this.getSolde(m)>= 0; } protected int getSolde(Membre m) { return 0; protected int getSolde(Membre m) { return 0; } public void vetoableChange(PropertyChangeEvent evt) public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException { throws PropertyVetoException { if (evt.getNewValue() == null) return; if (evt.getNewValue() == null) return; if ( !isSolvable((Membre)evt.getNewValue())) { if ( !isSolvable((Membre)evt.getNewValue())) { throw new PropertyVetoException("emprunteur non solvable", evt); throw new PropertyVetoException("emprunteur non solvable", evt); } }}

Support optionnel pour les propriétés liées void addPropertyChangeListener (String propertyName, PropertyChangeListener listener); void removePropertyChangeListener (String propertyName, PropertyChangeListener 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 Listener(PropertyChangeListener p); void remove Listener(PropertyChangeListener p);

Support optionel support pour les propriétés contraintes nommées void addVetoableChangeListener (String propertyName, VetoableChangeListener listener); void removeVetoableChangeListener (String propertyName, VetoableChangeListener 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 Listener(VetoableChangeListener p); void remove Listener(VetoableChangeListener p);

Les classes de support en Java ► class java.beans.PropertyChangeEvent  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.PropertyChangeListener ► class java.beans.PropertyChangeSupport  Aucun événement n’est déclenché si les anciennes valeurs sont égales et non-nulles. ► class java.beans.PropertyVetoException ► interface java.beans.VetoableChangeListener ► class java.beans.VetoableChangeSupport