CSC4102: Programmation orient´ee objet en Java et construction de logiciel
Denis Conan, avec Christian Bac
Janvier 2022
Sommaire
1. Motivations et objectifs de la s´ eance 2. Retours sur l’h´ eritage
3. Classe param´ etr´ ee (par un type)
4. ´ Enum´ eration, annotation, argument variadique 5. Visibilit´ e, ´ egalit´ e et hachage
6. Biblioth` eque, avec l’exemple des collections 7. Construction de logiciel avec Maven 8. Mise en pratique en TP (2h) + HP (3h)
2/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
1 Motivations et objectifs de la s´ eance
1.1 Contexte — O` u en sommes-nous ?
1.2 Qui demande ` a outiller la construction du logiciel ? 1.3 Quels sont les objectifs de la s´ eance ?
3/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
1.1 Contexte — O` u en sommes-nous ?
■ Mise en place du processus de construction du logiciel
■ Premi` ere ´ ebauche des classes (sans les exceptions et sans les tests)
■ A venir dans la s´ ` eance 6
• Gestion des cas d’erreur avec les exceptions
• Programmation des tests unitaires et de validation
Spécification Comprendre les
besoins, décrire le
Conception détaillée Expression des besoins
S’accorder sur les fonctionnalités du système
QUOI du système
Détailler le COMMENT pour un langage de programmation donné
Préparation...
Codage
des tests ...Exécution
Tests unitaires Pour un objet, chaque opération fonctionne−t−elle correctement ? Tests d’intégration
Tests de validation
Les différentes parties du logiciel fonctionnent−elles correctement ensemble ?
Le système est−il conforme au cahier des charges ? Le système est−il conforme à la spécification ? Recette
Logiciel Cahier des charges
Conception préliminaire S’accorder sur le COMMENT
de construction du système
fonctionnalités et tests
Objet de la séance
4/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
1.2 Qui demande ` a outiller la construction du lo- giciel ?
Un ´ editeur de texte comme emacs ou un environnement de d´ eveloppement comme Eclipse ne suffisent-ils pas ?
Section 42 de «
The Pragmatic Programmer : From journeyman to master»
[Hunt and Thomas, 2000]■ We were once at a client where all the developers were using the same IDE.
Their system administrator gave each developer a set of instructions on installing add-on packages to the IDE.
• These instructions filled many pages—pages full of click here, scroll there, drag this, double-click that, and do it again [...]
■ IDEs have their advantages, but with IDEs alone it can be hard to achieve the level of automation that we are looking for.
• We want to check out, build, test, and ship with a single command.
■ Dans ce module, nous utilisons Maven + GitLab CI
• Pour construire notre application et la tester ` a chaque commande git push
5/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
1.3 Quels sont les objectifs de la s´ eance ?
■ En chemin vers un premier noyau fonctionnel de l’application
• Programmation des classes
− Attributs et op´ erations des premiers cas d’utilisation
• Uniquement ceux qui sont n´ ecessaires pour la r´ ealisation des cas d’utilisation du Sprint 1
− Ce cours : programmation sans prise en compte des cas d’erreurs
■ Outillage de la construction du logiciel
• Etude de ´ Maven : squelette de configuration fourni au d´ emarrage du d´ epˆ ot
− Nous faisons le « pari » que nous gagnerons du temps ensuite
• « Let the computer do the repetitions, the mundane—it will do a better job of it than we would. We’ve got more important and more difficult things to do. »
[Hunt and Thomas, 2000]6/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2 Retours sur l’h´ eritage
2.1 Transtypage
2.2 Red´ efinition (en anglais, overriding ) 2.3 Classes abstraites
2.4 Interfaces
7/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.1 Transtypage
■ Vers le haut (en anglais, upcast) = implicite : une r´ ef´ erence d’une classe T peut r´ ef´ erencer toute instance de la classe T ou de ses classes enfants
■ Vers le bas (en anglais, downcast) = explicite : une r´ ef´ erence d’une classe S d´ eriv´ ee d’une classe T peut recevoir une r´ ef´ erence de la classe T si et seulement si :
• L’objet r´ ef´ erenc´ e est autoris´ e : bien du type S ou d’un de ses types d´ eriv´ es
• Le changement de type est explicite vers le nouveau type
Classeseance5.mediathequesimplifiee.transtypage.ExempleTranstypage 1 D o c u m e n t doc = n u l l;
2 A u d i o a u d i o =n e w A u d i o ( " 3 " , " R o c k ␣ b o t t o m " , " R o b e r ␣ W y a t t " , " 73 " , " P r o g r e s s i f " ) ; 3 doc = a u d i o ; // t r a n s t y p a g e v e r s le haut , u p c a s t
4 S y s t e m . out . p r i n t l n ( " doc ␣ est ␣ un ␣ D o c u m e n t ␣ : ␣ " + ( doc i n s t a n c e o f D o c u m e n t ) 5 + " ; ␣ doc ␣ est ␣ un ␣ A u d i o ␣ : ␣ " + ( doc i n s t a n c e o f A u d i o ) ) ;
6 a u d i o = ( A u d i o ) doc ; // t r a n s t y p a g e v e r s le bas , d o w n c a s t
7 S y s t e m . out . p r i n t l n ( " a u d i o ␣ est ␣ un ␣ D o c u m e n t ␣ : ␣ " +( a u d i o i n s t a n c e o f D o c u m e n t ) 8 + " ; ␣ a u d i o ␣ est ␣ un ␣ A u d i o ␣ : ␣ " + ( a u d i o i n s t a n c e o f A u d i o ) ) ;
doc est un Document : true; doc est un Audio : true audio est un Document : true; audio est un Audio : true
8/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.2 Red´ efinition (en anglais, overriding )
■ Red´ efinition possible des m´ ethodes publiques ou prot´ eg´ ees h´ erit´ ees
• C’est le principe de substitution de Liskov&Wing (polymorphisme d’inclusion)
■
Mettre l’annotation@Override= v´erification du prototype par le compilateur■ Quelle m´ ethode est appel´ ee ? = ⇒ liaison dynamique
• Red´ efinition la plus proche dans l’arbre d’h´ eritage de la classe actuelle
Classeseance5.mediathequesimplifiee.liaisontardive.ExempleLiaisonTardive
1 D o c u m e n t doc = n e w D o c u m e n t ( " C 0 0 7 " , " Le ␣ s e i g n e u r ␣ des ␣ a n n e a u x " , " T o l k i e n " ,
" 1 9 5 0 " ) ;
2 A u d i o a u d i o = n e w A u d i o ( " C 0 0 3 " , " R o c k ␣ b o t t o m " , " R o b e r ␣ W y a t t " , " 1 9 7 3 " , "
P r o g r e s s i f " ) ;
3 S y s t e m . out . p r i n t l n ( doc . t o S t r i n g () ) ; 4 S y s t e m . out . p r i n t l n ( a u d i o . t o S t r i n g () ) ;
5 doc = a u d i o ; // t r a n s t y p a g e v e r s le haut , t y p e f o r m e l / a c t u e l = D o c u m e n t / A u d i o 6 S y s t e m . out . p r i n t l n ( doc . t o S t r i n g () ) ; // a p p e l de t o S t r i n g de A u d i o
Document[code=C007, titre=Le seigneur des anneaux, auteur=Tolkien, annee=1950, empruntable=false, emprunte=false, nbEmprunts=0]
Audio[classification=Progressif, toString()=Document[code=C003, titre=Rock bottom, auteur=Rober Wyatt, annee=1973, empruntable=false, emprunte=false, nbEmprunts=0]]
Audio[classification=Progressif, toString()=Document[code=C003, titre=Rock bottom, auteur=Rober Wyatt, annee=1973, empruntable=false, emprunte=false, nbEmprunts=0]]
9/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.3 Classes abstraites
classification:string nbEmpruntsTotal:integer=0
Audio Vidéo
nombrePage:integer Livre nbEmpruntsTotal:integer=0 DURÉE:integer=6*7 TARIF:double=0.5 TARIF:double=1.0
DURÉE:integer=4*7
duréeFilm:integer mentionLégale:string nbEmpruntsTotal:integer=0 DURÉE:integer=2*7 TARIF:double=1.5 code:string
titre:string auteur:string année:string empruntable:booléen=F /emprunté:booléen=F nbEmprunts:integer=0
<<abstract>> dureeEmprunt() : double
<<abstract>> tarifEmprunt() : double
<<abstract>>
Document
■ Classe abstraite Document qui
ne peut pas ˆ etre instanci´ ee
• Raison 1 :
on ne veut pas d’instance
• Raison 2 :
des m´ ethodes ne sont pas d´ efinies
■ Sp´ ecialisation n´ ecessaire jusqu’` a obtenir des classes instanciables
• P.ex. la classe Audio
= ⇒ La classe abstraite impose un comportement commun ` a toutes les classes enfants
■ Possibilit´ e de cr´ eer des tableaux ou des collections de r´ ef´ erences de type de la classe abstraite
10/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.3.1 Exemple de classe abstraite
Classeseance5.mediathequesimplifiee.classeabstraite.Document 1 p u b l i c a b s t r a c t c l a s s D o c u m e n t {
2 // ...
3 p u b l i c b o o l e a n e m p r u n t e r () {
4 e m p r u n t e = t r u e; g e n r e . e m p r u n t e r () ; n b E m p r u n t s ++; r e t u r n t r u e; } 5 p u b l i c a b s t r a c t i n t d u r e e E m p r u n t () ; // non d e f i n i e
6 p u b l i c a b s t r a c t d o u b l e t a r i f E m p r u n t () ; // non d e f i n i e
7 // ...
Classeseance5.mediathequesimplifiee.classeabstraite.Audio
1 // ...
2 @ O v e r r i d e // r e d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e
3 p u b l i c b o o l e a n e m p r u n t e r () { s u p e r. e m p r u n t e r () ; n b E m p r u n t s T o t a l ++; r e t u r n t r u e; }
4 @ O v e r r i d e // d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e 5 p u b l i c i n t d u r e e E m p r u n t () { r e t u r n D U R E E ; } 6 @ O v e r r i d e // d e f i n i t i o n a v e c r e s p e c t du p r o t o t y p e 7 p u b l i c d o u b l e t a r i f E m p r u n t () { r e t u r n T A R I F ; }
8 // ...
11/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.4 Interfaces
Document
<<abstract>>
code:string titre:string auteur:string année:string empruntable:booléen=F /emprunté:booléen=F nbEmprunts:integer=0
classification:string nbEmpruntsTotal:integer=0
Audio Vidéo
TARIF:double=1.0 DURÉE:integer=4*7
duréeFilm:integer mentionLégale:string nbEmpruntsTotal:integer=0 DURÉE:integer=2*7 TARIF:double=1.5
nombrePage:integer Livre nbEmpruntsTotal:integer=0 DURÉE:integer=6*7 TARIF:double=0.5
Empruntable<<interface>>
dureeEmprunt() : Integer tarifEmprunt() : Double
■ Les membres d’une interface sont principalement
1des m´ ethodes abstraites
■ Une interface est d´ eclar´ ee avec le mot r´ eserv´ e interface
■ Une interface peut h´ eriter (extends) de plusieurs interfaces
■ Une classe peut impl´ ementer (implements) une ou plusieurs interfaces
• Rappel : une classe n’h´ erite (extends) que d’une seule classe
1. Depuis la version 5, possibilit´ e de d´ efinir des constantes (public +
final), et depuis laversion 8, possibilit´ e de d´ efinir des
default methodsainsi que des m´ ethodes
static12/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
2.4.1 Exemple d’interface
Interfaceseance5.mediathequesimplifiee.exempleinterface.Empruntable 1 p u b l i c i n t e r f a c e E m p r u n t a b l e {
2 i n t d u r e e E m p r u n t () ; // d e f i n i t i o n d ’ un p r o t o t y p e ( c o n t r a t ) 3 d o u b l e t a r i f E m p r u n t () ; // d e f i n i t i o n d ’ un p r o t o t y p e ( c o n t r a t ) 4 }
Classeseance5.mediathequesimplifiee.exempleinterface.Document
1 p u b l i c a b s t r a c t c l a s s D o c u m e n t i m p l e m e n t s E m p r u n t a b l e { // i m p l e m e n t a t i o n
Classeseance5.mediathequesimplifiee.exempleinterface.Audio 1 p u b l i c f i n a l c l a s s A u d i o e x t e n d s D o c u m e n t { // h e r i t a g e
2 // ...
3 @ O v e r r i d e // r e s p e c t du p r o t o t y p e de l ’ i n t e r f a c e 4 p u b l i c i n t d u r e e E m p r u n t () { r e t u r n D U R E E ; } 5 @ O v e r r i d e // r e s p e c t du p r o t o t y p e de l ’ i n t e r f a c e 6 p u b l i c d o u b l e t a r i f E m p r u n t () { r e t u r n T A R I F ; }
7 // ...
13/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
3 Classe param´ etr´ ee (par un type)
■ Polymorphisme param´ etrique ; generics dans la terminologie JAVA
Opération générique Attribut générique Paramètre de type
élément : E taille : Integer premierÉlément : E dernierÉlément : E
ajouter(E) estPrésent(E) retirer(E)
ListeDeChoses E
■ Param` etre de type = classe associ´ ee ` a la classe des objets manipul´ es
■ Classe associ´ ee sp´ ecifi´ ee entre « <> »
• P.ex. ArrayList<String> myStringArray = new ArrayList<>();
14/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
4 ´ Enum´ eration, annotation, argument variadique
■ Enum´ ´ eration = type ´ enum´ er´ e en JAVA
Classeseance5.enumeration.Dimension 1 p u b l i c e n u m D i m e n s i o n { A4 , A5 , L E T T E R ; }■ Annotation = sucre syntaxique associant des m´ eta-donn´ ees ` a un ´ el´ ement
• Nom introduit par « @ » avec possiblement des arguments (nom=valeur)
• Annotations standards
−
@Override: utilis´ ee par le compilateur pour v´ erifier l’invariance des prototypes lors de la red´ efinition de m´ ethode
− @Deprecated : utilis´ ee par JavaDoc pour d´ econseiller l’utilisation de la m´ ethode
− @SuppressWarnings : utilis´ ee par le compilateur pour ne pas g´ en´ erer les avertissements concernant l’´ el´ ement annot´ e
• Dans la s´ eance 6, les annotations de JUnit
■ Argument variadique en JAVA
Classeseance5.argumentvariadique.ExempleVarArg 1 p r i v a t e s t a t i c S t r i n g f o r m a t (f i n a l S t r i n g ... s t r i n g s ) {2 O b j e c t s . r e q u i r e N o n N u l l ( s t r i n g s ) ; 3 var r e s u l t = n e w S t r i n g B u f f e r () ;
4 f o r ( S t r i n g s t r i n g : s t r i n g s ) { r e s u l t . a p p e n d ( " ␣ " ) . a p p e n d ( s t r i n g ) ; } 5 r e t u r n r e s u l t . t o S t r i n g () ; }
15/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5 Visibilit´ e, ´ egalit´ e et hachage
5.1 Visibilit´ e des attributs et des op´ erations 5.2 ´ Egalit´ e de contenu — M´ ethode equals 5.3 Hachage — M´ ethode hashCode
16/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.1 Visibilit´ e des attributs et des op´ erations
package p2;
class C4 extends C1 { ...
} class C5 {
...
} package p1;
class C1 { public int a;
}
class C2 extends C1 { ...
} class C3 {
...
}
protected int b;
int c; // package private int d;
■
private= seule la classe courante
■
package= private + classes du paquetage
• package par d´ efaut
■
protected=
package+ classes enfants
■
public= toutes les classes
a b c d
Accessible de C2 oui oui oui – Accessible de C3 oui oui oui – Accessible de C4 oui oui – – Accessible de C5 oui – – –
17/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.2 ´ Egalit´ e de contenu — M´ ethode equals
´ Egalit´ e de r´ ef´ erence Versus ´ egalit´ e de contenu d’objet
■ o1 == o2 = r´
∆ef´ erences ´ egales
(mˆ eme objet en m´ emoire)
■ o1.equals(o3) = contenus ´
∆egaux
(objets peut-ˆ etre diff´ erents en m´ emoire)
o1
o2
o3
21/02/11
21/02/11
Classeseance5.collections.ExempleCalendarEquals
1 D a t e i n i t i a l = C a l e n d a r . g e t I n s t a n c e () . g e t T i m e () ; // v a l e u r i n i t i a l e 2 C a l e n d a r o1 = C a l e n d a r . g e t I n s t a n c e () ; o1 . s e t T i m e ( i n i t i a l ) ;
3 C a l e n d a r o2 = o1 ; // e g a l i t e de r e f e r e n c e 4 C a l e n d a r o3 = // m e m e v a l e u r i n i t i a l e
5 C a l e n d a r . g e t I n s t a n c e () ; o3 . s e t T i m e ( i n i t i a l ) ; 6 S y s t e m . out . p r i n t l n ( " o1 ␣ == ␣ o2 ␣ : ␣ " + ( o1 == o2 )
7 + " ,\ t " + " o1 . e q u a l s ( o2 ) ␣ : ␣ " + ( o1 . e q u a l s ( o2 ) ) ) ; 8 S y s t e m . out . p r i n t l n ( " o1 ␣ == ␣ o3 ␣ : ␣ " + ( o1 == o3 )
9 + " ,\ t " + " o1 . e q u a l s ( o3 ) ␣ : ␣ " + ( o1 . e q u a l s ( o3 ) ) ) ; Traces d’ex´ecution :
o1 == o2 : true, o1.equals(o2) : true o1 == o3 : false, o1.equals(o3) : true
18/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.2.1 M´ ethode equals avec instanceof
Classeseance5.mediathequesimplifiee.equalshashcode.ClientAvecInstanceof 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;
2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;
3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;
M´ethodeequals(´egalit´e de contenu) :
clients « ´ egaux » = mˆ
∆emes noms et mˆ emes pr´ enoms
1 @ O v e r r i d e // D e f a u l t i m p l e m e n t a t i o n in O b j e c t is ( t h i s == obj ) 2 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // G e n e r a t e d w i t h E c l i p s e 3 if ( obj == n u l l) { r e t u r n f a l s e; }
4 if (t h i s == obj ) { r e t u r n t r u e; }
5 if (!( obj i n s t a n c e o f C l i e n t A v e c I n s t a n c e o f ) ) { r e t u r n f a l s e; } 6 C l i e n t A v e c I n s t a n c e o f c = ( C l i e n t A v e c I n s t a n c e o f ) obj ;
7 r e t u r n ( nom . e q u a l s ( c . nom ) && p r e n o m . e q u a l s ( c . p r e n o m ) ) ;
8 }
■ Dans Eclipse , menu Source puis Generate hashCode() and equals()
• Lors de la g´ en´ eration, cocher la case « Use “instanceof” to compare types » . Comme sugg´ er´ e par J. Bloch
[Bloch, 2008], notre pr´ ef´ erence va ` a cette fac ¸on de faire, c’est-` a-dire equals mis en œuvre avec instanceof
19/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.2.2 M´ ethode equals avec getClass
Classeseance5.mediathequesimplifiee.equalshashcode.ClientAvecGetClass 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;
2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;
3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;
M´ethodeequals(´egalit´e de contenu) :
clients « ´ egaux » = mˆ
∆emes noms et mˆ emes pr´ enoms
1 @ O v e r r i d e // D e f a u l t i m p l e m e n t a t i o n in O b j e c t is ( t h i s == obj ) 2 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // G e n e r a t e d w i t h E c l i p s e 3 if ( obj == n u l l) { r e t u r n f a l s e; }
4 if (t h i s == obj ) { r e t u r n t r u e; }
5 if ( g e t C l a s s () != obj . g e t C l a s s () ) { r e t u r n f a l s e; } 6 C l i e n t A v e c G e t C l a s s c = ( C l i e n t A v e c G e t C l a s s ) obj ; 7 r e t u r n ( nom . e q u a l s ( c . nom ) && p r e n o m . e q u a l s ( c . p r e n o m ) ) ;
8 }
■ Dans Eclipse , menu Source puis Generate hashCode() and equals()
20/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.3 Hachage — M´ ethode hashCode
■ M´ ethode utilis´ ee pour calculer un indice dans certaines collections, plus pr´ ecis´ ement les dictionnaires
■ Contrat de base :
• Doit retourner la mˆ eme valeur lorsqu’elle est appel´ ee plusieurs fois sur le mˆ eme objet
• ∀o
1, o
2: o
1.equals(o
2) = ⇒ o
1.hashCode() = o
2.hashCode()
− La contrapos´ ee n’est pas vraie
• Peut retourner la mˆ eme valeur pour deux objets diff´ erents
• C’est la limite du hachage
Espace des objets
Espace des entiers du hachage
21/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
5.3.1 Exemple hashCode
Classeseance5.mediathequesimplifiee.equalshashcode.Client 1 p r i v a t e S t r i n g nom , prenom , a d r e s s e ;
2 p r i v a t e i n t n b E m p r u n t s E n C o u r s = 0 , n b E m p r u n t s D e p a s s e s = 0 , n b E m p r u n t s E f f e c t u e s = 0;
3 p r i v a t e D a t e d a t e R e n o u v e l l e m e n t , d a t e I n s c r i p t i o n ; 4 p r i v a t e i n t c o d e R e d u c t i o n = 0;
M´ethodehashCode:
mˆ emes attributs que ceux utilis´ es dans equals
(nom,pr´enom)1 p u b l i c i n t h a s h C o d e () { // G e n e r a t e d w i t h E c l i p s e 2 f i n a l i n t p r i m e = 37 , m a g i c = 17;
3 i n t r e s u l t = m a g i c ;
4 if ( nom != n u l l) { r e s u l t += nom . h a s h C o d e () ; }
5 if ( p r e n o m != n u l l) { r e s u l t = p r i m e * r e s u l t + p r e n o m . h a s h C o d e () ; } 6 r e t u r n r e s u l t ;
7 }
■ Algorithme utilis´ e par Eclipse = celui de J. Bloch
[Bloch, 2008]• Dans Eclipse, menu Source puis Generate hashCode() and equals()
22/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6 Biblioth` eque, avec l’exemple des collections
6.1 Organisation des biblioth` eques 6.2 Quelques interfaces
6.3 Quelques classes concr` etes
6.4 Algorithmes dans la classe Collections 6.5 Dictionnaires Map<K,V>
6.6 Structure d’une HashMap, equals et hashCode 6.7 Parcours de collections
23/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.1 Organisation des biblioth` eques
■ P.ex. les collections pour les associations avec des multiplicit´ es ̸= 0..1
■ Conceptuellement, une biblioth` eque = + Interface = types de donn´ ees abstraits
− Les interfaces constituent un standard de fait du langage + Classes concr` etes = structures de donn´ ees
− Les classes concr` etes sont les mises en œuvre de r´ ef´ erence
− Possibilit´ e de construire de nouvelles mises en œuvre + Algorithmes = m´ ethodes de classe pour trouver, trier, etc.
− M´ ethodes polymorphiques, donc applicables ` a beaucoup de classes concr` etes
. Autres langages :
C++ Standard Template Library(STL),
Smalltalk’s collection hierarchy24/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.2 Quelques interfaces
Pour boucle « for−each » avec méthode forEach()
Tri sur la clé List<E>
<<interface>>
add(E) : boolean
<<interface>>
Collection<E>
: boolean
addAll(Collection <? extends E>) clear()
contains(Object) : boolean isEmpty() : boolean iterator() : Iterator<E>
remove(Object) : boolean removeAll(Collection<?>) : boolean size() : int
Map<K,V>
<<interface>>
Iterable<E>
<<interface>>
add(E) : boolean
toArray(T[]) : <T> [T]
Set<E>
<<interface>>
SortedMap<K,V><<interface>>
SortedSet<E><<interface>>
■ List<E> avec doublons possibles (liste), Set<E> sans doublon (ensemble)
■ Map<K,V> apparie une cl´ e (k ∈ K ) et un objet (v ∈ V ) (dictionnaire)
• La cl´ e k indentifie de fac ¸on unique v
■ Toutes les interfaces sont param´ etr´ ees avec un ou plusieurs types
■ Certaines m´ ethodes sont dites optionnelles dans la documentation
• Une classe concr` ete peut ne pas « supporter » des m´ ethodes optionnelles.
Dans ce cas, la mise en œuvre l` eve l’exception UnsupportedOperationException
25/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.3 Quelques classes concr` etes
■ Diff´ erentes cat´ egories de classes concr` etes
• Mises en œuvre de base
• Mises en œuvre pour la concurrence d’acc` es (cf. java.util.concurrent)
• Mises en œuvre sp´ ecifiques, p.ex. avec tri des ´ el´ ements
■ Uniquement trois mises en œuvre de base n´ ecessaires dans ce module
• Pour les collections de petite taille, ArrayList ≡ tableau de taille dynamique
• Pour les collections de grande taille, HashMap ≡ dictionnaire
• Pour les petites collections, TreeSet ≡ Ensemble tri´ e
26/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel La classe E doit implémenter Comparable<E>
+
Pas de méthode get get(int index) : E
<<interface>>
List<E>
add(int, E) indexOf(E) : int lastIndexOf(E) : int remove(int index) set(int index, E newE) : E subList(int from, int to) : List<E>
AbstractList<E><<abstract>>
ArrayList<E>
<<interface>>
Set<E>
AbstractSet<E><<abstract>>
TreeSet<E>
add(int, E) remove(int index)
SortedSet<E>
<<interface>>
containsKey(K) : boolean
<<interface>>
Map<K,V>
containsValue(V) : boolean get(Object) : V put(K, V) : V replace(K, V) : V entrySet() : Set<Map.Entry<K,V>
HashMap<K,V>
6.4 Algorithmes dans la classe Collections
■ sort : tri d’une liste (merge sort
algorithm)■ reverse : r´ eordonne en sens inverse
■ fill : remplissage avec un ´ el´ ement donn´ e
■ copy : d’une liste ` a une autre
■ swap : permuter deux ´ el´ ements donn´ es
■ addAll : ajouter tous les ´ elements d’une liste
■ binarySearch : pour trouver un
´ el´ ement
■ frequency : compte le nombre d’occurrences
■ disjoint : pas d’´ el´ ements en commun
■ min et max : selon l’op´ erateur de tri
■ shuffle : m´ elange al´ eatoire des
´ el´ ements
Classeseance5.collections.ExempleTriListe 1 i m p o r t j a v a . u t i l . A r r a y s ;
2 i m p o r t j a v a . u t i l . C o l l e c t i o n s ; 3 i m p o r t j a v a . u t i l . L i s t ; 4 p u b l i c c l a s s E x e m p l e T r i L i s t e {
5 p u b l i c s t a t i c v o i d m a i n ( S t r i n g [] a r g s ) {
6 List < String > l i s t e = A r r a y s . a s L i s t (n e w S t r i n g [] { " x " , " d " , " e " , " d " }) ; 7 C o l l e c t i o n s . s o r t ( l i s t e ) ; // m e t h o d e g e n e r i q u e de tri sur une l i s t e 8 S y s t e m . out . p r i n t l n ( l i s t e ) ;
9 }
10 }
27/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.5 Dictionnaires Map<K,V>
■ La classe associ´ ee ` a la cl´ e doit red´ efinir les m´ ethodes hashCode() et equals()
• Si la cl´ e d’une classe contient plusieurs attributs
alors il faut cr´ eer une classe pour rassembler ces attributs
2(concept de n-uplet)
Classeseance5.collections.ClefClient1 p u b l i c f i n a l c l a s s C l e f C l i e n t { 2 p r i v a t e S t r i n g nom ;
3 p r i v a t e S t r i n g p r e n o m ;
4 p u b l i c C l e f C l i e n t (f i n a l S t r i n g n , f i n a l S t r i n g p ) { t h i s. nom = n ; t h i s. p r e n o m = p ; }
5 p u b l i c b o o l e a n e q u a l s (f i n a l O b j e c t obj ) { // . . .
6 }
7 p u b l i c i n t h a s h C o d e () { // . . .
8 }
Classeseance6.mediathequesimplifiee.pourlestests.Mediatheque 1 p r i v a t e Map < C l e f C l i e n t , Client > l e s C l i e n t s ;
2 l e s C l i e n t s = n e w H a s h t a b l e < C l e f C l i e n t , Client >() ;
3 C l e f C l i e n t hc = n e w C l e f C l i e n t ( cl . g e t N o m () , cl . g e t P r e n o m () ) ;
2. Sinon, besoin de cr´ eer des objets factices pour obtenir un ´ el´ ement
28/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.6 Structure d’une HashMap, equals et hashCode
Classeseance5.collections.ExempleHashMap 1 Map < String , String > hm = n e w HashMap < >() ;
2 hm . put ( " Ba " , " Bah " ) ; hm . put ( " Aa " , " aha " ) ; hm . put ( " BB " , " b e b e " ) ; 3 f o r ( Entry < String , String > e : hm . e n t r y S e t () ) {
4 S y s t e m . out . p r i n t l n ( e . g e t K e y () + " ␣ ( " + e . g e t V a l u e () . h a s h C o d e () + " ) ␣ : ␣ " + e . g e t V a l u e () ) ; }
Traces d’ex´ ecution
Clef hashCode() : Valeur Aa (2112) : aha BB (2112) : bebe Ba (2143) : Bah
Bebe Aha
Bah 2112 2143
BB
Aa Ba
■ Recherche d’une valeur v ` a partir d’une cl´ e k :
1. hashCode(k) donne l’ensemble des cl´ es ayant mˆ eme valeur de hachage 2. equals(k) donne la bonne cl´ e, puis la valeur v
29/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
6.7 Parcours de collections
■ Construction for-each : utilise implicitement un it´ erateur
• Pas d’acc` es ` a l’it´ erateur = ⇒ pas de suppression d’´ el´ ement dans la boucle
Classeseance5.collections.ExempledeParcoursDeCollection
1 f o r ( Entry < String , Integer > e n t r y : d i c t i o n n a i r e . e n t r y S e t () ) {
2 S y s t e m . out . p r i n t ( e n t r y . g e t K e y () + " - > " + e n t r y . g e t V a l u e () + " , ␣ " ) ; 3 // d i c t i o n n a i r e . r e m o v e ( e n t r y . g e t K e y () ) ; //= > e x c e p t i o n C o n c u r r e n t M o d i f ...
4 }
■ Construction avec while et un it´ erateur explicite
• hasNext() : retourne vrai si l’it´ erateur contient encore une ´ el´ ement
• next() : retourne l’´ el´ ement suivant
• remove() : supprime le dernier ´ el´ ement retourn´ e par next() de la collection
3Classeseance5.collections.ExempledeParcoursDeCollection 1 I t e r a t o r < String > i t E l e m = l i s t e . i t e r a t o r () ; 2 w h i l e ( i t E l e m . h a s N e x t () ) { // i t e r a t e u r e x p l i c i t e
3 S t r i n g e l e m = i t E l e m . n e x t () ; S y s t e m . out . p r i n t ( e l e m + " , ␣ " ) ; 4 i t E l e m . r e m o v e () ; // s u p p r e s s i o n p o s s i b l e
5 }
■ Cf. ...ExempledeParcoursDeCollection pour des exemples de parcours
3. Possible, mais un peu dangereux et ` a ´ eviter
30/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
7 Construction de logiciel avec Maven
7.1 Motivations — Pourquoi Maven ? 7.2 D´ epˆ ot et arborescence standard
7.3 Processus de construction, version simplifi´ ee
. https://maven.apache.org et
http://books.sonatype.com/mvnex-book/reference/index.html
31/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
7.1 Motivations — Pourquoi Maven ?
■ Toujours le mˆ eme processus de construction : javac, javadoc, jar, etc.
■ Logiciels d´ ecompos´ es en de multiples modules
■ Le casse-tˆ ete des d´ ependances
xerces
aval
dom4j
asm
xstream dream−annotation
junit julia−runtime dtdparser
julia−asm
fractal−spoonlet
spoon−core log4j
eclipse.jdt.core jsap ant fractal−adl
fractal−rmi dream−adl
dream−core
julia−mixins fscript
antlr
cosmos−core
cosmos−lib saje
cosmos−saje
fractal−util
task−deployment
task−framework
ast−core
monolog−api fractal−api
perseus−cache easymock
jdom joda−time
xml−writer stax wstw−asl
stax−api xom xpp3_min cglib_nodep
jettison jmock
oro commons−lang
■ Am´ elioration par rapport ` a make et Ant (Cf. « Pour aller plus loin »)
32/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
7.2 D´ epˆ ot et arborescence standard
■ D´ epˆ ots (Repositories)
• Beaucoup de d´ epˆ ots sont disponibles
− P.ex. http://search.maven.org/ ou https://mvnrepository.com/
• D´ epˆ ot local dans le r´ epertoire: ˜/.m2/repository
− Peupl´ e comme un cache des d´ epˆ ots distants
■ Arborescence standard — version simplifi´ ee
• pom.xml: POM (Project Object Model ), toujours au niveau le plus ´ elev´ e
• D´ eclaration de configuration du processus de construction du module
• LICENSE.txt et README.md
• src/main/java: code source du module
• src/test/java: code source des tests du module
• target: tous les contenus g´ en´ er´ es (*.class, *.jar, site Web...)
33/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
7.3 Processus de construction, version simplifi´ ee
jar:jar
test surefire:test
install:install
deploy:deploy process−test−resources resources:testResources
test−compile compiler:test−compile
package
install
deploy compile
process−resources
compiler:compile resources:resources PHASES PLUGINS:GOALS
34/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
8 Mise en pratique en TP (2h) + HP (3h)
■ Etude du module ´ Maven pr´ epar´ e, cr´ eation du projet Eclipse
D´ ecouverte de la biblioth` eque eu.telecomsudparis.csc4102.util (dates, console)
■ D´ ebut de la programmation de l’application
• Classes, attributs, constructeurs, m´ ethodes invariant()
• Au besoin, m´ ethodes equals et hashCode, voire toString
• On programme des cas d’utilisation (algo. des m´ ethodes dans les diagrammes de s´ equences)
− Et non « une classe compl` ete, puis une autre, etc. »
■ Rendu de la s´ eance en HP (3h): PDF + JAVA, dans « sprint1 »
• Le script de fin de s´ eance v´ erifie que le code de votre projet compile
■ Compl´ ements « Pour aller plus loin » sur la construction de logiciel avec
Maven35/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel
R´ ef´ erences I
Bloch, J. (2008).
Effective Java, 2nd Edition.
Addison-Wesley.
Hunt, A. and Thomas, D. (2000).
The Pragmatic Programmer: From journeyman to master.
Addison-Wesley.
Maven (2016).
Apache Maven Project.
https://maven.apache.org.
O’Brien, T., Brian, J., van Zyl, J., Xu, J., Locher, T., Fabulich, D., Redmond, E., and Snyder, B. (2016).
Maven by Example.
http://books.sonatype.com/mvnex-book/reference/index.html.
Creative Commons License.
36/36 01/2022 Denis Conan CSC4102 : Programmation Java et construction de logiciel