1 ASPECTS AVANCÉS DES CLASSES EN JAVA (PARTIE 1) Plan 2 Classe immuable Classe membre statique Classe interne/ Classe membre Classes utilitaires: java.time Collections Classe immuable 3 Dorra ZAIBI Cours POO/JAVA Un objet immuable (ou non-modifiable) est un objet dont l'état ne peut pas être modifié pendant toute sa durée de vie. Une classe immuable est une classe dont les instances sont immuables par conception et implémentation. La classe Java la plus communément présentée comme exemple d'immuabilité est java.lang.String. Les méthodes d’un objet immuable sont en lecture seule, elle ne devrait jamais inclure de méthodes modifiant l’état interne de l’objet. Classe immuable 4 Dorra ZAIBI Cours POO/JAVA Pour construire l’API d’un objet immuable, nous devons garantir que son état interne ne changera pas, peu importe la façon dont nous utilisons son API. Notez que Java nous garantit que la valeur de amount ne changera pas, c’est le cas de toutes les variables de type primitif. Cependant, dans notre exemple, nous ne pouvons que garantir que currency ne changera pas. Nous devons donc nous fier à l’API Currency pour se protéger des modifications ** . final class Money { Classe immuable 5 La plupart du temps, nous avons besoin des attributs d’un objet pour contenir des valeurs personnalisées, et l’emplacement pour initialiser l’état interne d’un objet immuable est son constructeur: Comme mentionné, pour répondre aux exigences d’une API immuable, notre classe Money ne dispose que de méthodes en lecture seule. Dorra ZAIBI Cours POO/JAVA final class Money { Classe immuable 6 Avantages Dorra ZAIBI Cours POO/JAVA Puisque l’état interne d’un objet immuable reste constant dans le temps , nous pouvons le partager en toute sécurité entre plusieurs threads (lors de l’exécution des tâches simultanément). Classe immuable: Consignes 7 Pour rendre un objet immuable, il faut respecter plusieurs consignes lors de l'écriture de sa classe : Dorra ZAIBI Cours POO/JAVA elle doit être final pour empêcher la création d'une classe fille qui permettrait de modifier son état en ajoutant ou en redéfinissant des méthodes tous les champs doivent être private pour empêcher l'accès aux données sans passer par une méthode de la classe tous les champs devraient être final pour éviter toute modification après leur initialisation elle ne doit pas proposer de setter ni de méthodes qui pourraient modifier l'état de l'objet il faut toujours renvoyer une nouvelle instance pour une méthode qui modifie les données de la classe il faut que les getter d'une propriété de type objet renvoient une version immuable ou une autre instance qui soit une copie Dorra ZAIBI Cours POO/JAVA Exemple 8 Plan 9 Classe immuable Classe membre statique Classe interne/ Classe membre Classes utilitaires: java.time Collections Classe membre statique 10 Une classe membre statique est une classe java définie dans la partie déclaration des membres d'une autre classe qui la contient (nommée classe englobante), puis qualifiée par le modificateur static. Une classe membre statique est instanciable. Une classe membre statique ne peut pas être associée à un objet instancié de la classe englobante . Syntaxe : public class Enveloppe { < membres genre attributs > < membres genre méthodes > < membres genre classes membres statiques > } Classe membre statique: Exemple Dorra ZAIBI Cours POO/JAVA 11 Classe membre statique 12 Dorra ZAIBI Cours POO/JAVA On peut dans une autre classe, instancier un objet de classe statique, à condition d'utiliser le qualificateur de visibilité qui est le nom de la classe englobante afin d'accéder à la classe interne. On peut aussi instancier un objet local Obj1 dans une méthode de la classe Autre : Classe membre statique 13 Une classe membre statique accède à tous les membres statiques de sa classe englobante qu'ils soient publics ou privés, sans nécessiter d'utiliser le nom de la classe englobante pour accéder aux membres (raccourcis d'écriture) Quatre façons pour appeler la méthode meth12( ): ils différent uniquement par l'utilisation ou la non utilisation de raccourcis d'écriture. public static class clasMembStat1 { public void meth( ){ meth12(a1); Enveloppe1.meth12(a1); meth12(Enveloppe1.a1); Enveloppe1.meth12(Enveloppe1.a1); } } Classe membre statique 14 Dorra ZAIBI Cours POO/JAVA Une classe membre statique n'a pas accès aux membres d'instance de la classe englobante Plan 15 Classe immuable Classe membre statique Classe interne/ Classe membre Classes utilitaires: java.time Collections Classe interne 16 Une classe membre, appelée aussi classe interne (inner classe) est une classe java définie dans la partie déclaration des membres d'une autre classe qui la contient (nommée classe englobante). Une classe membre est instanciable. Une classe membre est associée à un objet instancié de la classe englobante . Syntaxe : public class Enveloppe { < membres genre attributs > < membres genre méthodes > < membres genre classes membres statiques > < membres genre classes membres > } Classe interne 17 Dorra ZAIBI Cours POO/JAVA Une classe membre se déclare d’une manière identique à une classe membre statique et aux autres membres de la classe englobante Classe interne : Remarque 18 Dorra ZAIBI Cours POO/JAVA Il est possible d'imbriquer plusieurs classes internes. Si plusieurs classes internes sont imbriquées, il n'est pas possible d'utiliser un nom pour la classe qui soit déjà attribué à une de ses classes englobantes. Le compilateur génèrera une erreur à la compilation. Classe interne 19 On peut dans une autre classe, instancier un objet de classe membre, à condition d'utiliser le qualificateur de visibilité qu'est le nom de la classe englobante afin d'accéder à la classe interne. Une classe membre se comporte en fait comme une classe ordinaire relativement à l'instanciation class Autre{ Enveloppe2.classeMembre obj0 = new Enveloppe2.classeMembre (); } On peut aussi instancier un objet local Obj1 dans une méthode de la classe Autre : class Autre{ Enveloppe2.classeMembre obj0 = new Enveloppe2.classeMembre (); void meth(){ Enveloppe2.classeMembre obj1 = new Enveloppe2.classeMembre (); } } Classe interne: Exemple Dorra ZAIBI Cours POO/JAVA 20 Classe interne 21 Remarque: Dorra ZAIBI Cours POO/JAVA Les classes membres ont les mêmes fonctionnalités syntaxiques que les classes membres statiques. La différence notable entre ces deux genres de classes se situe dans l'accès à l'instance d'objet de classe englobante : Un objet de classe interne non statique comporte une référence à l'objet de classe externe qui l'a créé, alors qu'il n'en est rien pour une classe membre statique. L'accès a lieu à travers le mot clé this qualifié par le nom de la classe englobante : "ClasseEnveloppe.this" . Classe interne: Exemple 22 Dorra ZAIBI Cours POO/JAVA On utilise le mot clé this à la fois pour obtenir la référence de l'objet de classe classeMembre et Enveloppe2.this pour obtenir la reférence sur l'objet externe de classe englobante Plan 23 Classe immuable Classe membre statique Classe interne/ Classe membre Classes utilitaires: java.time Collections Classes utilitaires java.time 24 Dorra ZAIBI Cours POO/JAVA Depuis Java 8, une nouvelle API a été introduite pour représenter les dates, le temps et la durée. Toutes ces classes ont été regroupées dans la package java.time. Parmi les sous-packages: java.time : contient les classes de bases, immuables qui encapsulent des données temporelles java.time.format : contient les classes pour analyser et formater des dates/heures API Date/Time 25 Les Dates Les classes LocalDate, LocalTime et LocalDateTime permettent de représenter respectivement une date, une heure, une date et une heure. Dorra ZAIBI Cours POO/JAVA On peut facilement passer d’un type à une autre. Par exemple la méthode LocalDate.atTime() permet d’ajouter une heure à une date, créant ainsi une instance de LocalDateTime. Toutes les instances de ces classes sont immutables. Si on veut avoir l’information de la date ou de l’heure d’aujourd’hui, on peut créer une instance grâce à la méthode now() API Date/Time 26 Il existe plusieurs méthodes comme: now() , of(), parse() Autres méthodes utilitaires retournant le jour, le mois, l'année, l’heure, la min Dorra ZAIBI Cours POO/JAVA getMonth(), getDayOfMonth(), getYear(), getHour(), getMinute(), getSecond() API Date/Time: Exemple 1 27 Résultat: Date et heure courante : 2018-01 19T09:29:44.150862600 Date courante : 2018-01-19 Mois: JANUARY, jour: 19, heure: 9 Autre façon de faire : 2023-12-25 Date parsée : 20:15:30 API Date/Time: Exemple 2 28 Plusieurs méthodes pour exécuter des calculs sur les dates ● plus(), plusDay(), plusMonth(), plusWeek(),plusYear() Dorra ZAIBI Cours POO/JAVA ● minus(), minusDay(), minusMonth(), minusWeek(), minusYear() API Date/Time 29 Dorra ZAIBI Cours POO/JAVA Les classe Year et YearMonth permettent de manipuler les dates et d’obtenir des informations intéressantes à partir de l’année ou du mois et de l’année. API Date/Time: Exemple 30 Dorra ZAIBI Cours POO/JAVA Pour déterminer si une année est bissextile, vous pouvez invoquer la méthode isLeap() sur une instance de la classe java.time.Year. Cette méthode retourne true si le test réussit et false dans le cas contraire. API Date/Time 31 Remarque: Dorra ZAIBI Cours POO/JAVA Les classes LocalDate, LocalTime, LocalDateTime, Year, YearMonth et Instant implémentent toutes les interfaces Temporal Classe Instant 32 Dorra ZAIBI Cours POO/JAVA La classe Instant représente un point dans le temps. Contrairement aux classes précédentes qui permettent de représenter les dates pour les humains, la classe Instant est adaptée pour réaliser des traitements de données temporelles. Période et durée 33 Dorra ZAIBI Cours POO/JAVA Il est possible de définir des périodes grâce à des instances de la classe Period. Une période peut être construite directement ou à partir de la différence entre deux instances de type Temporal. Il est ensuite possible de modifier une date en ajoutant ou soustrayant une période. Période et durée: Exemple 34 Dorra ZAIBI Cours POO/JAVA Calculer son âge à partir d'une date Période et durée 35 Dorra ZAIBI Cours POO/JAVA La durée est représentée par une instance de la classe Duration. Elle peut être obtenue à partir de deux instances de Instant. Formatage des dates 36 Dorra ZAIBI Cours POO/JAVA Pour formater une date pour l’affichage, il est possible d’utiliser la méthode format déclarée dans les classes LocalDate, LocalTime, LocalDateTime, Year et YearMonth. Le format de représentation d’une date et/ou du temps est défini par la classe DateTimeFormatter. Formatage des dates: Exemple Dorra ZAIBI Cours POO/JAVA 37 Lecture des dates 38 Dorra ZAIBI Cours POO/JAVA Pour transformer une chaîne de caractères en date (notamment pour obtenir une date à partir de la saisie d’un utilisateur ou de la lecture d’un fichier), il est possible d’utiliser la méthode parse déclarée dans les classes LocalDate, LocalTime, LocalDateTime, Year et YearMonth. Le format d’une date et/ou du temps est défini par la classe DateTimeFormatter. Lecture des dates: Exemple Dorra ZAIBI Cours POO/JAVA 39 Plan 40 Classe immuable Classe membre statique Classe interne/ Classe membre Classes utilitaires: java.time Collections Les collections 41 Structures de données C'est l'organisation efficace d'un ensemble de données, sous la forme de tableaux, de listes, de piles etc. Cette efficacité réside dans la quantité mémoire utilisée pour stocker les données, et le temps nécessaire pour réaliser des opérations sur ces données Utilisation de collections pour Dorra ZAIBI Cours POO/JAVA - stocker, rechercher et manipuler des données - transmettre des données d ’une méthode à une autre Exemples : - un dossier de courrier : collection de mails - un répertoire téléphonique : collection d’associations noms/numéros de téléphone. Le JDK fournit d’autres types de collections sous la forme de classes et d’interfaces Ces classes et interfaces sont dans le paquetage java.util Les collections 42 Dorra ZAIBI Cours POO/JAVA Collections = structures de données Listes Ensembles Tableaux Arbres Tables de hashage La plupart des opérations sur un tableau (parcours, recherche, ajout, suppression, etc.) sont déjà implémentées => On parle de Java Collections Framework (JCF) Les collections 43 Dorra ZAIBI Cours POO/JAVA Le framework Collections a une architecture hiérarchique pour représenter toutes les collections qui contiennent ou héritent des interfaces, implémentations et méthodes comme le tri des objets. Les collections sont composées d’une hiérarchie d'interfaces. Celles-ci encapsulent la majeure partie des méthodes utilisables avec toutes les implémentations concrètes. Les interfaces sont divisées en deux groupes: L'interface de base est java.util.Collection. L'autre interface est java.util.Map. Les collections en java Dorra ZAIBI Cours POO/JAVA 44 Les collections Dorra ZAIBI Cours POO/JAVA 45 Ces structures sont complexes à implanter (⇒ Efficacité) Ordonnées ou non Doublons ou non Accès aux données indexé ou non Recherche Tris Quelques structures de données classiques comme: ArrayList, Vector, HashSet. Les collections en Java 46 Dorra ZAIBI Cours POO/JAVA Les collections Java contiennent des éléments de type Object Les collections: Interfaces 47 Des interfaces dans deux hiérarchies principales : - Collection<E> Dorra ZAIBI Cours POO/JAVA - Map<K,V> 1) Collection, correspond aux interfaces des collections proprement dites 2) Map, correspond aux collections indexées par des clés ; un élément de type V d’une map est retrouvé rapidement si on connaît sa clé de type K (comme les entrées d’un dictionnaire ou les entrées de l’index d’un livre) Les collections: Hiérarchie des interfaces Dorra ZAIBI Cours POO/JAVA 48 Les collections: Interfaces 49 Ces interfaces ont des particularités correspondant à des besoins spécifiques Exemple: Cours POO/JAVA Dorra ZAIBI Collection : interface qui est implémentée par la plupart des objets qui gèrent des collections. Map : interface qui définit des méthodes pour des objets qui gèrent des collections sous la forme clé/valeur Set : interface pour des objets qui n'autorisent pas la gestion des doublons dans l'ensemble List : interface pour des objets qui autorisent la gestion des doublons et un accès direct à un élément SortedSet : interface qui étend l'interface Set et permet d'ordonner l'ensemble SortedMap : interface qui étend l'interface Map et permet d'ordonner l'ensemble Les collections: Classes 50 Dorra ZAIBI Cours POO/JAVA Classes abstraites : AbstractCollection<E>, AbstractList<E>, AbstractMap<K,V>,… qui implantent les méthodes de base communes aux collections (ou map) Classes concrètes : ArrayList<E>, LinkedList<E>, HashSet<E>, TreeSet<E>, HashMap<K,V>, TreeMap<K,V>,… qui héritent des classes abstraites ; elles implantent, en particulier, les méthodes d’accès aux données (get, put, add,…) Les collections: Classes concrètes 51 Dorra ZAIBI Cours POO/JAVA Classes concrètes qui implémentent les interfaces Les collections: Exemple de List Dorra ZAIBI Cours POO/JAVA 52 Remarque 53 Dorra ZAIBI Cours POO/JAVA Les collections de java.util ne peuvent contenir de valeurs des types primitifs Avant le JDK 5, il fallait donc utiliser explicitement les classes enveloppantes des types primitifs, Integer par exemple A partir du JDK 5, les conversions entre les types primitifs et les classes enveloppantes peuvent être implicite avec le « boxing » /« unboxing » Les collections: Exemple avec boxing Dorra ZAIBI Cours POO/JAVA 54 Interface COLLECTION<E> Dorra ZAIBI Cours POO/JAVA 55 COLLECTION <E>: Implémentations Dorra ZAIBI Cours POO/JAVA 56 Interface COLLECTION<E> 57 Dorra ZAIBI Cours POO/JAVA L’interface Collection <E> correspond à un objet qui contient un groupe d’objets de type E JDK ne fournit pas une implémentation directe de cette interface mais pour des interfaces plus spécifiques telles que Set et List COLLECTION <E>: Méthodes communes héritées de Collection Dorra ZAIBI Cours POO/JAVA 58 COLLECTION <E>: Notion de méthode optionnelle 59 Dorra ZAIBI Cours POO/JAVA Il peut exister de nombreux cas particuliers de collections ; par exemple - collections composées d’objets non modifiables - collections de taille fixe, - collections dont on ne peut enlever des objets Plutôt que de fournir une interface pour chaque cas particulier, l'API sur les collections comporte la notion de méthode optionnelle. COLLECTION <E>: Constructeurs 60 Dorra ZAIBI Cours POO/JAVA Il n’est pas possible de donner des constructeurs dans une interface ; mais la convention donnée par les concepteurs des collections est que toute classe d’implantation des collections doit fournir au moins 2 constructeurs : un constructeur sans paramètre un constructeur qui prend une collection d’éléments de type compatible en paramètre COLLECTION <E>: Transformation en tableau 61 Dorra ZAIBI Cours POO/JAVA toArray() renvoie une instance de Object[] qui contient les éléments de la collection Si on veut un tableau d'un autre type, il faut utiliser la méthode paramétrée <T>: T [ ] toArray(T [ ] tableau) à laquelle on passe un tableau du type voulu => • si le tableau est assez grand, les éléments de la collection sont rangés dans le tableau sinon, un nouveau tableau du même type est créé pour recevoir les éléments de la collection COLLECTION <E>: Transformation en tableau 62 • Dorra ZAIBI Cours POO/JAVA • Forme simple : sans paramètre Object [ ] a = c.toArray(); Pour obtenir un tableau de type String [ ]: String [ ] tableau =collection.toArray(new String[0]); Remarque : si la collection est vide, toArray renvoie un tableau de taille 0 (pas la valeur null) Les Types de Collections 63 Dorra ZAIBI Cours POO/JAVA Les Collections de type List Les Collections de type Set Les Collections de type Map Les Classes de Collections 64 Dorra ZAIBI Cours POO/JAVA Interface java.util.Set<E> Interface java.util.List<E> Interface java.util.Map<E> Résumé 65 Dorra ZAIBI Cours POO/JAVA Résumé 66