CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
Denis Conan
Janvier 2022
Sommaire
1. Motivations et objectifs
2. Outils d’analyse statique de code = Pour aider ! 3. D´ efinition idiome/patron d’impl´ ementation
4. Idiomes JAVA, premiers exemples, m´ ethodes de la classe Object communes
` a tous les objets
5. Mise en pratique en TP (2h) + HP (3h)
2/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
1 Motivations et objectifs
1.1 Qui demande ` a am´ eliorer la qualit´ e du code ? 1.2 Pourquoi les idiomes ?
1.3 Quels sont les objectifs de la s´ eance ?
1.4 Apr` es la s´ eance — ` A quoi c ¸a sert ? o` u ? quand ?
3/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
1.1 Qui demande ` a am´ eliorer la qualit´ e du code ?
« The Google FindBugs Fixit »
[Ayewah and Pugh, 2010]In May 2009, Google conducted a company wide
FindBugs“fixit”
1. Hundreds of engineers reviewed thousands of
FindBugswarnings.
■ Static analysis tools [such as FindBugs ] scan software looking for issues that might cause defective behavior.
■ Most interesting software quality problems were eventually found and fixed without FindBugs , but FindBugs could have found these problems early, when they are cheap to remediate.
• These observations [are attributed] to the success of Google’s testing and monitoring practices.
■ Engineers viewed FindBugs warnings as worth fixing.
• Over 77% of the reviews identified the warnings as real defects and recommended fixing the underlying problems.
1. C’est ce que l’on appelle une revue de code, ici avec
FindBugs, qui a ´et´ e repris dans
SpotBugs[Ayewah et al., 2008]4/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
1.2 Pourquoi les idiomes ?
G.L. Steele, ACM Grace Murray Hopper Award, 1988 Foreword of « Effective JAVA »
[Bloch, 2008]■ If you ever studied a second language yourself and then tried to use it outside the classroom, you know that there are three things you must master :
1. How the language is structured (grammar)
2. How to manage things you want to talk about (vocabulary) 3. The customary and effective ways to say everyday things (usage)
■ It is much the same with a programming language.
1. You need to understand the core language [UML,JAVA = object-orientation]
2. You need to know the vocabulary [e.g. JAVA standard library for collections]
3. You need to be familiar with the customary and effective ways to structure your code
− C’est ce qui s’appelle les patrons d’impl´ ementation ou idiomes
5/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
1.3 Quels sont les objectifs de la s´ eance ?
■ Etudier la ´ qualit´ e du code produit dans le Sprint 1
• On paie de la dette technique
• Avec les outils SpotBugs et CheckStyle
− On att´ enue les efforts n´ ecessaires ` a l’aide d’outil d’analyse statique du code
■ Etudier l’application d’idiomes ´ JAVA
• On am´ eliore la qualit´ e du code en am´ eliorant nos connaissances sur le langage
• A titre d’exemple, sur les ` m´ ethodes communes ` a toutes les classes : equals, hashCode, toString, etc.
■ Continuer le d´ eveloppement de l’application de l’´ etude de cas
• On annonce d` es maintenant les nouveaux cas d’utilisation pour l’ensemble du Sprint 2
6/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
1.4 Apr` es la s´ eance — ` A quoi ¸ ca sert ? o` u ? quand ?
■ P´ eriodiquement, utiliser les outils d’analyse statique de code dans Eclipse
■ Maintenir la qualit´ e (passage des tests) avec l’int´ egration continue
[optionn.]
Pour ceux qui veulent aller plus loin, possibilit´ e de g´ en´ erer un site Web Maven, qui pr´ esente les rapports de qualit´ e
[optionn.]
Pour les « professionnels », possibilit´ e de faire ´ echouer la construction du logiciel en cas de probl` emes d´ etect´ es avec les outils CheckStyle et SpotBugs
− Dans ce module, nous n’irons pas jusque l` a
7/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2 Outils d’analyse statique de code = Pour aider !
2.1 Analyse statique de code 2.2 SpotBugs
2.3 CheckStyle
8/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.1 Analyse statique de code
1. Image extraite du cours CSC4536 :
http://www-inf.int-evry.fr/COURS/CSC4536/web/9/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2 SpotBugs
■ Cat´ egories (https://spotbugs.github.io/)
• Correctness bug : Probable bug, an apparent coding mistake resulting in code that was probably not what the developer intended
−
We strive for a low false positive rate• Bad Practice : Violations of recommended and essential coding practice
− Examples include hash code and equals problems, cloneable idiom, dropped exceptions, serializable problems, and misuse of finalize
−
We strive to make this analysis accurate, although some groups may not careabout some of the bad practices
• Dodgy (douteux, risqu´ e) : Code that is confusing, anomalous, or written in a way that leads itself to errors
− Examples include dead local stores, switch fall through, unconfirmed casts, and redundant null check of value known to be null
−
More false positives accepted1.
SpotBugsdoesn’t try to identify all defects in a particular category
[Ayewah et al., 2008]10/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2.1 Exemples, a/e
1 X x2 = n e w X2 ( . . . ) ;
2 h2 . put ( x2 , " c ’ est ␣ un ␣ o b j e t " ) ;
■ « X2 doesn’t define a hashCode() method but is used in a hashed data structure in main(String[]) »
• « A class defines an equals(Object) method but not a hashCode() method, and thus doesn’t fulfill the requirement that equal objects have equal hashCodes.
An instance of this class is used in a hash data structure, making the need to fix this problem of highest importance. »
− Le probl` eme vient de ce que la classe poss` ede une m´ ethode equals mais pas de m´ ethode hashCode
• Rappelons-nous qu’un dictionnaire (ajout avec m´ ethode put) utilise hashCode puis equals pour chercher un objet
11/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2.2 Exemples, b/e
1 pi = n u l l;
2 f o r( it = v P e r s o n n e s . i t e r a t o r () ; it . h a s N e x t () ; pi = it . n e x t () ) {
3 if( pi . e q u a l s (n e w P e r s o n n e ( " D u p o n t " +5 , " J u l e s " , " 1 9 1 0 2 2 7 1 2 7 1 " +5) ) ) { 4 it . r e m o v e () ;
5 }
6 }
■ « D´ er´ ef´ erencement d’un pointeur null dans la m´ ethode main(String[]) »
• « Un pointeur ` a null est d´ er´ ef´ erenc´ e ici. Ceci va mener ` a une NullPointerException quand le code sera ex´ ecut´ e. »
− Le probl` eme est ` a la ligne 2 : l’affectation « pi = it.next() » n’a lieu qu’en fin de boucle ;
donc, lors de l’entr´ ee dans la boucle for, pi vaut sa valeur avant la boucle, c’est-` a-dire ici null
12/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2.3 Exemples, c/e
1 if ( p . g e t P r e n o m () == p1 . g e t P r e n o m () ) {// . ..
■ « Comparaison d’objets String utilisant == ou !=. »
• « Ce code compare des objets String au moyen de l’´ egalit´ e par r´ ef´ erence des op´ erateurs == ou !=. ` A moins que les deux chaˆınes ne soient des constantes dans le fichier source ou aient ´ et´ e internalis´ ees au moyen de la m´ ethode String.intern(), deux chaˆınes identiques peuvent ˆ etre repr´ esent´ ees par deux objets String diff´ erents. Envisagez d’utiliser la m´ ethode equals(Object) ` a la place. »
− SpotBugs signale l’utilisation de l’op´ erateur « == » ` a la place de la m´ ethode « equals »
− C’est sans aucun doute une erreur pour des variables qui sont des r´ ef´ erences sur des objets
13/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2.4 Exemples, d/e
1 C a l e n d a r o2 = o1 ;
2 S y s t e m . out . p r i n t l n ( " o1 ␣ == ␣ o2 ␣ : ␣ " + ( o1 == o2 ) + " ,\ t ␣ o1 . e q u a l s ( o2 ) ␣ : ␣ " + ( o1 . e q u a l s ( o2 ) ) ) ;
■ This method compares a local variable with itself, and may indicate a typo or a logic error. Make sure that you are comparing the right things.
• L’alerte vient de la combinaison de l’affectation de la ligne 1 avec l’appel de la m´ ethode equals ` a la ligne 2
14/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.2.5 Exemples, e/e
1 p u b l i c A u d i o (f i n a l S t r i n g code , f i n a l L o c a l i s a t i o n l o c a l i s a t i o n ,
2 f i n a l S t r i n g titre , f i n a l S t r i n g auteur , f i n a l S t r i n g annee , 3 f i n a l G e n r e genre , f i n a l S t r i n g c l a s s i f ) {
4 s u p e r( code , l o c a l i s a t i o n , titre , auteur , annee , g e n r e ) ; 5 if ( c l a s s i f == n u l l) {
6 t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " Ctr ␣ A u d i o ␣ c l a s s i f i c a t i o n ␣ = ␣ " + c l a s s i f i c a t i o n ) ; }
7 t h i s. c l a s s i f i c a t i o n = c l a s s i f ; 8 }
■ « Lecture du champ Audio.classification non initialis´ e dans new Audio(...). »
• « Ce constructeur lit un champ qui n’a pas encore ´ et´ e initialis´ e. Une des causes les plus fr´ equentes est l’utilisation accidentelle par le d´ eveloppeur du champ au lieu d’un des param` etres du constructeur. »
− Le probl` eme est ` a la ligne 6 : on voulait sans aucun doute utiliser l’argument classif au lieu de l’attribut classification
• Mais, dans ce cas, on sait que c’est null qui sera affich´ e
15/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3 CheckStyle
■ Comme son nom le sugg` ere, adh´ esion ` a un standard de codage
• Deux fournis par d´ efaut dans Eclipse
− Sun Checks et Google checks
■ Pour nous, l’objectif « num´ ero 1 » est la documentation Javadoc
• Configuration particuli` ere de CheckStyle fournie en TP
− Feuille de style construite ` a partir de Sun Checks
• Nous autorisons les tabulations, les caract` eres « » dans les noms de paquettages, les lignes ` a plus de 80 colonnes, etc.
• Nous ne d´ eveloppons pas une biblioth` eque
• Uniquement pour quelques classes
• G´ en´ eration de la documentation dans Eclipse
(menuProject/Generate Javadoc)− Possibilit´ e pour ceux qui le souhaitent de g´ en´ erer avec Maven
(mvn site)1. https://checkstyle.sourceforge.io/
16/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3.1 Documentation Javadoc I
Classeeu.telecomsudparis.csc4102.util.Datutil
1 /* *
2 * c o m p a r e la d a t e a v e c a u j o u r d ’ hui : v r a i si a u j o u r d ’ hui .
3 *
4 * @ p a r a m d a t e la d a t e a c o m p a r e r a v e c le j o u r c o u r a n t . 5 * @ r e t u r n v r a i si a u j o u r d ’ hui
6 * @ t h r o w s I l l e g a l A r g u m e n t E x c e p t i o n si { @ c o d e d a t e } est { @ c o d e n u l l }
7 */
8 p u b l i c s t a t i c b o o l e a n d a t e E s t A u j o u r d h u i (f i n a l L o c a l D a t e d a t e ) {
9 if ( d a t e == n u l l) {
10 t h r o w n e w I l l e g a l A r g u m e n t E x c e p t i o n ( " d a t e ␣ == ␣ n u l l " ) ;
11 }
12 r e t u r n d a t e . e q u a l s ( a u j o u r d h u i () ) ;
13 }
http://www.oracle.com/technetwork/java/javase/documentation/index-jsp-135444.html [Javadoc, JSE8]
Notez que les commentaires Javadoc commencent par la chaˆıne de caract`eres « /** »
17/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3.1 Documentation Javadoc II
■ V´ erification de la pr´ esence et correction « du Javadoc » avec CheckStyle
1 /* * 2 * Bla bla .
3 * @ p a r a m e e x p l i c a t i o n sur e .
4 */
5 p u b l i c v o i d a j o u t e r (f i n a l i n t a , f i n a l i n t b ) { };
• « Balise javadoc @param inutilis´ e pour ‘e’. »
• « Balise javadoc @param manquante pour ‘a’. »
• « Balise javadoc @param manquante pour ‘b’. »
18/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3.2 Autres exemples I
■ Aussi pr´ esent´ e dans
[Bloch, 2008], Item 8
1 p r i v a t e i n t V a l e u r ;
2 p u b l i c v o i d M a M e t h o d e () { // . ..
• « Le nom ‘Valeur’ n’est pas conforme ` a l’expression
‘ˆ[a-z][a-zA-Z0-9]*$’. »
• « Le nom ‘MaMethode’ n’est pas conforme ` a l’expression
‘ˆ[a-z][a-zA-Z0-9]*$’. »
■ Standard d’´ ecriture lexicale du code JAVA
Paquetage seance5.mediathequesimplifie, eu.telecomsudparis.csc4102 Classe, interface Timer, HashMap, HttpServlet M´ ethode, attribut remove, ensureCapacity, getVote Constantes MIN VALUE, NEGATIVE INFINITY Variable locale i, somme, sommeVote
Param` etre de type
T, V, K, T1
19/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3.2 Autres exemples II
1 p u b l i c i n t b ;
■ « La variable ‘b’ devrait ˆ etre priv´ ee et avoir des accesseurs. »
1 p u b l i c S t r i n g t o S t r i n g () { r e t u r n " A ␣ [ V a l e u r = " + v a l e u r + " ] " ; }
■ « overrides java.lang.Object.toString »
• Ajouter @Override, sinon on risque une erreur difficile ` a trouver
− P.ex. si on ´ ecrit
« public String toString(boolean versionCourte)
{...}»
■ Autre exemple plus difficile ` a trouver pour le corriger :
« public boolean equals(Document obj)
{...}»
20/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
2.3.2 Autres exemples III
1 p u b l i c i n t a j o u t e r (i n t a , i n t b ) { 2 r e t u r n a + b ;
3 }
■ « Le param` etre a devrait ˆ etre final. »
■ « Le param` etre b devrait ˆ etre final. »
• Pour se pr´ emunir du changement de la valeur des arguments en oubliant que ces changements sont oubli´ es en fin de m´ ethode
− On ´ ecrira « public int ajouter(final int a, final int b)... »
21/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
3 D´ efinition idiome/patron d’impl´ ementation
■ Une des premi` eres occurrences du terme
• « Idioms — Because collections are so powerful, there are a small set of standard tricks that experienced Smalltalkers know to play with them. If you are reading code that uses one of these idioms, you may be puzzled at first.
This section introduces the problems you can solve using collections in unusual ways. »
[Beck, 1995]■ « By idioms, we mean some (often unusual) combination of abstractions specific to some programming language, which are used for implementing some other abstraction that is not part of this
language. »
[Czarnecki and Eisenecker, 2000]■ Notre position dans ce module : les idiomes permettent d’approfondir des concepts de base importants
■ Livre de r´ ef´ erence pour JAVA : « Effective Java, 3rd Edition »
[Bloch, 2018]• Dans CSC4102, ` a titre d’exemple, parcours de quelques idiomes
− M´ ethodes de la classe Object communes ` a toutes les classes
− Plus dans le document « pour aller plus loin » de cette s´ eance
22/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4 Idiomes JAVA, premiers exemples, m´ ethodes de la classe Object communes ` a tous les objets
4.1 M´ ethode equals 4.2 M´ ethode hashCode 4.3 M´ ethode toString
4.4 Les autres m´ ethodes de la classe Object
23/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4.1 M´ ethode equals
■ Repris de l’Item 8 de
[Bloch, 2018]■ Contrat
2 [Class Object, JSE8]• Reflexive : for any non-null reference value x, x.equals(x) should return true
• Symmetric : for any non-null reference values x and y, x.equals(y) should return true if and only if y.equals(x) returns true
• Transitive : for any non-null reference values x, y, and z, if x.equals(y) returns true and y.equals(z) returns true, then x.equals(z) should return
• true Consistent : for any non-null reference values x and y, multiple invocations of
x.equals(y) consistently return true or consistently return false, provided no information used in equals comparisons on the objects is modified
• For any non-null reference value x, x.equals(null) should return false
■ Cf. « pour aller plus loin » avec des exemples de non-respect des propri´ et´ es
• Conclusion : Utilisez l’assistant Eclipse pour g´ en´ erer les m´ ethodes equals + Choisir les attributs d´ efinissant de mani` ere unique un objet de la classe 2. Prend en argument un Object : utiliser @Override pour ´ eviter une erreur
24/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4.2 M´ ethode hashCode
■ Repris de l’Item 9 de
[Bloch, 2018]■ Red´ efinir equals impose de red´ efinir aussi hashCode :
∀o
1, o
2∈ Classe : o
1.equals(o
2) = ⇒ o
1.hashCode() = o
2.hashCode()
Classeseance7.methodescommunesatouslesobjets.CleErronee 1 p u b l i c f i n a l c l a s s C l e E r r o n e e {
2 p r i v a t e S t r i n g nom , p r e n o m ;
3 p u b l i c C l e E r r o n e e (f i n a l S t r i n g n , f i n a l S t r i n g p ) { nom = n ; p r e n o m = p ;}
4 @ O v e r r i d e 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 ) {// ... a v e c nom , p r e n o m 5 // pas de m e t h o d e h a s h C o d e ()
Classeseance7.methodescommunesatouslesobjets.ExempleCleSansHashCode 1 C l i e n t c = n e w C l i e n t ( " nom " , " p r e n o m " , " a d r e s s e " ) ;
2 C l e E r r o n e e c1 =n e w C l e E r r o n e e ( " nom " , " p r e n o m " ) , c2 =n e w C l e E r r o n e e ( " nom " , "
p r e n o m " ) ;
3 Map < C l e E r r o n e e , Client > d =n e w HashMap < C l e E r r o n e e , Client >() ; d . put ( c1 , c ) ; 4 S y s t e m . out . p r i n t ( c1 . h a s h C o d e () + " != " + c2 . h a s h C o d e () + " , ␣ " + d . get ( c2 ) ) ;
■ R´ esultat de l’ex´ ecution :
366712642!=1829164700, null
•
As much as is reasonably practical, thehashCodemethod defined by classObjectdoes return distinct integers for distinct objects. (This is typically implemented by converting the internal address of the object into an integer.)[Class Object, JSE8]25/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4.3 M´ ethode toString
■ Repris de l’Item 10 de
[Bloch, 2018]■ Toujours red´ efinir toString
•
Par d´efaut, nom de la classe +@+ repr´esentation hexad´ecimale non sign´ee de la valeur donn´ee parhashCode()Classeseance7.methodescommunesatouslesobjets.EnfantAvecToString 1 p u b l i c c l a s s E n f a n t A v e c T o S t r i n g e x t e n d s P a r e n t A v e c T o S t r i n g { 2 p r i v a t e i n t b ;
3 p u b l i c E n f a n t A v e c T o S t r i n g (f i n a l i n t a ,f i n a l i n t b ) {s u p e r( a ) ;t h i s. b = b ;}
4 @ O v e r r i d e p u b l i c S t r i n g t o S t r i n g () {
5 r e t u r n " E n f a n t A v e c T o S t r i n g ␣ [ b = " + b + " , ␣ t o S t r i n g () = " +s u p e r. t o S t r i n g () + " ] " ;}}
Classeseance7.methodescommunesatouslesobjets.ExemplesToString 1 E n f a n t S a n s T o S t r i n g e = n e w E n f a n t S a n s T o S t r i n g (1 ,2) ;
2 S y s t e m . out . p r i n t l n ( e + " , ␣ " + L o n g . t o H e x S t r i n g ( e . h a s h C o d e () ) ) ; 3 E n f a n t A v e c T o S t r i n g e2 = n e w E n f a n t A v e c T o S t r i n g (1 ,2) ;
4 S y s t e m . out . p r i n t l n ( e2 ) ;
■ R´ esultat de l’ex´ ecution :
seance7.methodescommunesatouslesobjets.EnfantSansToString@15db9742,15db9742 EnfantAvecToString [b=2, toString()=ParentAvecToString [a=1]]
26/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4.3.1 Assoc. bidirectionnelles et toString
Classeseance7.methodescommunesatouslesobjets.associationbidirectionnelle.Ensemble 1 p r i v a t e List < Element > e l e m s ;
2 p u b l i c E n s e m b l e (f i n a l i n t v ) { e l e m s = n e w A r r a y L i s t < Element >() ; } 3 p u b l i c v o i d a j o u t e r U n A (f i n a l i n t v ) { e l e m s . add (n e w E l e m e n t (this, v ) ) ; } 4 @ O v e r r i d e // r e d e f i n i t i o n : c o n t e n u t o S t r i n g () de e l e m s
5 p u b l i c S t r i n g t o S t r i n g () {r e t u r n " E n s e m b l e ␣ [ e l e m s = " + e l e m s + " ] " ;}}
Classeseance7.methodescommunesatouslesobjets.associationbidirectionnelle.Element 1 p r i v a t e i n t v ;
2 p r i v a t e E n s e m b l e ens ;
3 p u b l i c E l e m e n t (f i n a l E n s e m b l e ens , f i n a l i n t v ) {t h i s. v = v ;t h i s. ens = ens ;}
4 @ O v e r r i d e // r e d e f i n i t i o n : c o n t e n u de v et t o S t r i n g () de ens 5 p u b l i c S t r i n g t o S t r i n g () {r e t u r n " E l e m e n t ␣ [ v = " + v + " , ␣ ens = " + ens + " ] " ;}}
Classeseance7.methodescommunesatouslesobjets.associationbidirectionnelle.ExempleBoucleInfinie 1 E n s e m b l e b = n e w E n s e m b l e (1) ; b . a j o u t e r U n A (2) ; S y s t e m . out . p r i n t l n ( b ) ;
■ R´ esultat de l’ex´ ecution :
Exception in thread "main"
java.lang.StackOverflowError■ Il faut ´ eviter la formation du cycle d’appels
• Ensemble::toString doit utiliser des getters de Element au lieu d’utiliser Element::toString
27/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
Ensemble
Élément
*
4.3.2 ´ Enum´ erations avec toString *
Classeseance7.methodescommunesatouslesobjets.EnumerationSansRedefinitionDeToString 1 p u b l i c e n u m E n u m e r a t i o n S a n s R e d e f i n i t i o n D e T o S t r i n g { Premier , D e u x i e m e ;}
Classeseance7.methodescommunesatouslesobjets.EnumerationAvecRedefinitionDeToString 1 p u b l i c e n u m E n u m e r a t i o n A v e c R e d e f i n i t i o n D e T o S t r i n g {
2 P r e m i e r ( " Mon ␣ p r e m i e r " ) , D e u x i e m e ( " Mon ␣ s e c o n d " ) ; 3 p r i v a t e S t r i n g l i b e l l e ;
4 // n o t e z que le c o n s t r u c t e u r est p r i v e
5 p r i v a t e E n u m e r a t i o n A v e c R e d e f i n i t i o n D e T o S t r i n g (f i n a l S t r i n g l i b e l l e ) { 6 t h i s. l i b e l l e = l i b e l l e ; }
7 @ O v e r r i d e // r e d e f i n i t i o n : le libelle , p l u t o t que le nom de l ’ o b j e t 8 p u b l i c S t r i n g t o S t r i n g () { r e t u r n l i b e l l e ; } }
Classeseance7.methodescommunesatouslesobjets.ExemplesToStringEnumeration
1 S y s t e m . out . p r i n t l n ( E n u m e r a t i o n S a n s R e d e f i n i t i o n D e T o S t r i n g . D e u x i e m e ) ; 2 S y s t e m . out . p r i n t l n ( E n u m e r a t i o n A v e c R e d e f i n i t i o n D e T o S t r i n g . D e u x i e m e ) ;
■ R´ esultat de l’ex´ ecution :
Deuxieme Mon second
2. Le constructeur de EnumerationAvecRedefinitionDeToString est private car il n’existe aucune raison de le mettre public puisqu’aucun nouvel objet n’est instanciable depuis l’ext´ erieur
28/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
4.4 Les autres m´ ethodes de la classe Object
[Class Object, JSE8]
■ getClass : Returns the runtime class of this object
■ M´ ethodes pour la concurrence (hors programme CSC4102) :
• S’utilise avec la directive Synchronized
• notify : wakes up a single thread that is waiting on this object’s monitor
− If any threads are waiting on this object, one of them is chosen to be awakened
− The choice is arbitrary and occurs at the discretion of the implementation
• notifyAll : wakes up all threads that are waiting on this object’s monitor
• wait : causes the current thread to wait until either another thread invokes the notify() method or the notifyAll() method for this object, or a specified amount of time has elapsed
29/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
5 Mise en pratique en TP (2h) + HP (3h)
■ Qualit´ e du code avec SpotBugs puis CheckStyle
■ Idiomes : programmation des m´ ethodes communes ` a tous les objets
■ Continuation du d´ eveloppement de l’application de l’´ etude de cas
■ Rendu de la s´ eance en HP (3h) : PDF + JAVA dans « sprint2 »
■ Compl´ ements « Pour aller plus loin » sur les idiomes JAVA
30/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
R´ ef´ erences I
Ayewah, N. and Pugh, W. (2010).
The Google FindBugs Fixit.
InProc. of the 19th International Symposium on Software Testing and Analysis, pages 241–252, Trento, Italy.
Ayewah, N., Pugh, W., Hovemeyer, D., Morgenthaler, D., and Penix, J. (2008).
Using Static Analysis to Find Bugs.
IEEE Software, 25(5) :22–29.
Beck, K. (1995).
Smalltalk Best Practice Patterns Volume 1 : Coding.
Prentice Hall.
Bloch, J. (2008).
Effective Java, 2nd Edition.
Addison-Wesley.
Bloch, J. (2018).
Effective Java, 3rd Edition.
Addison-Wesley.
31/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA
R´ ef´ erences II
Class Object (JSE8).
Javadoc of the class Object of JAVA SE 8.
https:
//docs.oracle.com/javase/9/docs/api/index.html?java/lang/Object.html.
Czarnecki, K. and Eisenecker, U. (2000).
Generative Programming : Methods, Tools, and Applications.
Addison-Wesley.
Javadoc (JSE8).
Javadoc Tool.
http://www.oracle.com/technetwork/java/javase/documentation/
index-jsp-135444.html.
32/32 01/2022 Denis Conan CSC4102 : Qualit´e du code JAVA et introduction aux idiomes JAVA