03-ReglesDeCodage.html 54 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="generator" content="pandoc" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  7. <title>Regles De Codage</title>
  8. <style type="text/css">
  9. code{white-space: pre-wrap;}
  10. span.smallcaps{font-variant: small-caps;}
  11. span.underline{text-decoration: underline;}
  12. div.column{display: inline-block; vertical-align: top; width: 50%;}
  13. </style>
  14. <style type="text/css">
  15. a.sourceLine { display: inline-block; line-height: 1.25; }
  16. a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
  17. a.sourceLine:empty { height: 1.2em; position: absolute; }
  18. .sourceCode { overflow: visible; }
  19. code.sourceCode { white-space: pre; position: relative; }
  20. div.sourceCode { margin: 1em 0; }
  21. pre.sourceCode { margin: 0; }
  22. @media screen {
  23. div.sourceCode { overflow: auto; }
  24. }
  25. @media print {
  26. code.sourceCode { white-space: pre-wrap; }
  27. a.sourceLine { text-indent: -1em; padding-left: 1em; }
  28. }
  29. pre.numberSource a.sourceLine
  30. { position: relative; }
  31. pre.numberSource a.sourceLine:empty
  32. { position: absolute; }
  33. pre.numberSource a.sourceLine::before
  34. { content: attr(data-line-number);
  35. position: absolute; left: -5em; text-align: right; vertical-align: baseline;
  36. border: none; pointer-events: all;
  37. -webkit-touch-callout: none; -webkit-user-select: none;
  38. -khtml-user-select: none; -moz-user-select: none;
  39. -ms-user-select: none; user-select: none;
  40. padding: 0 4px; width: 4em;
  41. color: #aaaaaa;
  42. }
  43. pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
  44. div.sourceCode
  45. { }
  46. @media screen {
  47. a.sourceLine::before { text-decoration: underline; }
  48. }
  49. code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  50. code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  51. code span.at { color: #7d9029; } /* Attribute */
  52. code span.bn { color: #40a070; } /* BaseN */
  53. code span.bu { } /* BuiltIn */
  54. code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
  55. code span.ch { color: #4070a0; } /* Char */
  56. code span.cn { color: #880000; } /* Constant */
  57. code span.co { color: #60a0b0; font-style: italic; } /* Comment */
  58. code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  59. code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  60. code span.dt { color: #902000; } /* DataType */
  61. code span.dv { color: #40a070; } /* DecVal */
  62. code span.er { color: #ff0000; font-weight: bold; } /* Error */
  63. code span.ex { } /* Extension */
  64. code span.fl { color: #40a070; } /* Float */
  65. code span.fu { color: #06287e; } /* Function */
  66. code span.im { } /* Import */
  67. code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  68. code span.kw { color: #007020; font-weight: bold; } /* Keyword */
  69. code span.op { color: #666666; } /* Operator */
  70. code span.ot { color: #007020; } /* Other */
  71. code span.pp { color: #bc7a00; } /* Preprocessor */
  72. code span.sc { color: #4070a0; } /* SpecialChar */
  73. code span.ss { color: #bb6688; } /* SpecialString */
  74. code span.st { color: #4070a0; } /* String */
  75. code span.va { color: #19177c; } /* Variable */
  76. code span.vs { color: #4070a0; } /* VerbatimString */
  77. code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  78. </style>
  79. <link rel="stylesheet" href="buttondown.css">
  80. <!--[if lt IE 9]>
  81. <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  82. <![endif]-->
  83. </head>
  84. <body>
  85. <h1 id="règles-de-codage">Règles de codage</h1>
  86. <h2 id="introduction">Introduction</h2>
  87. <p>Dans cette partie, après avoir fait quelques programmes, nous allons voir ou revoir les règles <strong>essentielles</strong> du développement Java.</p>
  88. <ul>
  89. <li>organisation des classes en <code>package</code></li>
  90. <li>définition d’une classe</li>
  91. </ul>
  92. <h2 id="paquetages-package">Paquetages (package)</h2>
  93. <p>Un package permet de regrouper des classes qui partagent un même objectif dans une application ou une librairie.</p>
  94. <p>Par exemple, les classes du package <code>java.net</code> regroupent des outils d’accès au réseau. Les classes du package <code>java.io</code> regroupent les classes de gestion de flux d’entrées/sorties.</p>
  95. <p>Les packages:</p>
  96. <ul>
  97. <li>permettent d’organiser les classes dans une arborescence</li>
  98. <li>réduisent les problèmes de conflits de nom et sont sensés garantir une unicité dans l’identification d’une classe</li>
  99. <li>permettent de protéger l’utilisation de certains attributs / méthodes à l’intérieur d’un package donné.</li>
  100. </ul>
  101. <h3 id="nommage-des-packages">Nommage des packages</h3>
  102. <p>Les noms des paquetages sont <strong>TOUJOURS</strong> en minuscules (aucune majuscule).</p>
  103. <h3 id="exercice">Exercice</h3>
  104. <p>Vérifiez à quelles packages appartiennent les classes <code>String</code>, <code>Object</code> et <code>List</code>.</p>
  105. <p>Concernant la classe List, déterminez si elle est unique (dans l’ensemble des classes de l’API Java SE).</p>
  106. <h2 id="classes">Classes</h2>
  107. <p>Une classe est un modèle. Elle permet de déterminer le comportement d’un ensemble d’objets similaires et leurs caractéristiques et comportements.</p>
  108. <p>La classe va servir de prototype pour créer une instance. L’instance (ou exemplaire) d’une classe se comportera comme définit dans ce modèle.</p>
  109. <h3 id="définition-dune-classe">Définition d’une classe</h3>
  110. <div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
  111. <a class="sourceLine" id="cb1-2" data-line-number="2"> <span class="bu">String</span> nom; <span class="co">//attribut nom</span></a>
  112. <a class="sourceLine" id="cb1-3" data-line-number="3">}</a></code></pre></div>
  113. <h3 id="instantiation">Instantiation</h3>
  114. <p>L’instantiation se fait avec le mot clef <code>new</code></p>
  115. <div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1">RendezVous rendezVous = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a></code></pre></div>
  116. <h3 id="identification-dune-classe">Identification d’une classe</h3>
  117. <p>L’identification d’une classe se fait à partir de son nom et de son paquetage.</p>
  118. <p>Ainsi, le nom complet de la classe <code>String</code> est <code>java.lang.String</code>.</p>
  119. <p>Le nom complet de la classe <code>Date</code> est <code>java.util.Date</code> ou <code>java.sql.Date</code>. En effet il y a plusieurs classes <code>Date</code>.</p>
  120. <h4 id="import">Import</h4>
  121. <p>Si on veut les différencier il faut utiliser le nom complet. Ce qui serait peu lisible en pratique. Comme dans une classe on n’utilise en général qu’une de ces deux classes, on va utiliser un <code>import</code>.</p>
  122. <p>Ainsi, au lieu de devoir écrire:</p>
  123. <div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
  124. <a class="sourceLine" id="cb3-2" data-line-number="2"> java.<span class="fu">util</span>.<span class="fu">Date</span> dateRDV;</a>
  125. <a class="sourceLine" id="cb3-3" data-line-number="3">}</a></code></pre></div>
  126. <p>On va écrire:</p>
  127. <div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.Date;</span></a>
  128. <a class="sourceLine" id="cb4-2" data-line-number="2"><span class="kw">class</span> RendezVous {</a>
  129. <a class="sourceLine" id="cb4-3" data-line-number="3"> <span class="bu">Date</span> dateRDV;</a>
  130. <a class="sourceLine" id="cb4-4" data-line-number="4">}</a></code></pre></div>
  131. <p>Une fois un <code>import</code> fait dans un fichier, il est valide pour tout le fichier.</p>
  132. <h4 id="import-de-toutes-les-classes-dun-paquet">Import de toutes les classes d’un paquet</h4>
  133. <p>Il est possible aussi d’importer toutes les classes d’un même paquet en une seule fois avec le joker <code>*</code>.</p>
  134. <div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.util.*;</span></a>
  135. <a class="sourceLine" id="cb5-2" data-line-number="2"><span class="kw">class</span> RendezVous {</a>
  136. <a class="sourceLine" id="cb5-3" data-line-number="3"> <span class="bu">Date</span> dateRDV;</a>
  137. <a class="sourceLine" id="cb5-4" data-line-number="4">}</a></code></pre></div>
  138. <h2 id="attributs">Attributs</h2>
  139. <p>Les attributs d’une classe sont les éléments contenus par une classe.</p>
  140. <p>Dans l’exemple précédent, l’attribut <code>nom</code> permet de stocker le nom du <code>RendezVous</code> sous forme d’une chaîne de caractère.</p>
  141. <h3 id="attributs-dinstance">Attributs d’instance</h3>
  142. <p>La valeur d’un attribut est propre à une instance de classe. Chaque exemplaire d’une classe conservera une valeur spécifique pour cet attribut.</p>
  143. <p>Testez le code suivant (à mettre dans une méthode <code>main</code>):</p>
  144. <div class="sourceCode" id="cb6"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb6-1" data-line-number="1">RendezVous rendezVousA = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
  145. <a class="sourceLine" id="cb6-2" data-line-number="2">rendezVousA.<span class="fu">nom</span> = <span class="st">&quot;Premier rendez-vous&quot;</span>;</a>
  146. <a class="sourceLine" id="cb6-3" data-line-number="3">RendezVous rendezVousB = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
  147. <a class="sourceLine" id="cb6-4" data-line-number="4">rendezVousB.<span class="fu">nom</span> = <span class="st">&quot;Second rendez-vous&quot;</span>;</a>
  148. <a class="sourceLine" id="cb6-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousA); <span class="co">//RendezVous A</span></a>
  149. <a class="sourceLine" id="cb6-6" data-line-number="6"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousB); <span class="co">//RendezVous B</span></a></code></pre></div>
  150. <h3 id="attributs-de-classe">Attributs de classe</h3>
  151. <p>Il est possible de définir des attributs communs à toutes les instances d’une classe. Ce sont les attributs de classe.</p>
  152. <p>Ils sont définis en utilisant le mot clé <code>static</code>.</p>
  153. <div class="sourceCode" id="cb7"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb7-1" data-line-number="1"><span class="kw">class</span> RendezVous{</a>
  154. <a class="sourceLine" id="cb7-2" data-line-number="2"> <span class="bu">String</span> nom;</a>
  155. <a class="sourceLine" id="cb7-3" data-line-number="3"> <span class="dt">static</span> <span class="dt">int</span> compteur;</a>
  156. <a class="sourceLine" id="cb7-4" data-line-number="4">}</a>
  157. <a class="sourceLine" id="cb7-5" data-line-number="5"></a>
  158. <a class="sourceLine" id="cb7-6" data-line-number="6">...</a>
  159. <a class="sourceLine" id="cb7-7" data-line-number="7">RendezVous rendezVousA = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
  160. <a class="sourceLine" id="cb7-8" data-line-number="8">rendezVousA.<span class="fu">compteur</span> = <span class="dv">1</span>;</a>
  161. <a class="sourceLine" id="cb7-9" data-line-number="9">RendezVous rendezVousB = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
  162. <a class="sourceLine" id="cb7-10" data-line-number="10">rendezVousB.<span class="fu">compteur</span> += <span class="dv">1</span>;</a>
  163. <a class="sourceLine" id="cb7-11" data-line-number="11"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousA.<span class="fu">compteur</span>); <span class="co">//2</span></a>
  164. <a class="sourceLine" id="cb7-12" data-line-number="12"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(rendezVousB.<span class="fu">compteur</span>); <span class="co">//2</span></a></code></pre></div>
  165. <p><strong>Remarques importantes</strong></p>
  166. <ul>
  167. <li>Une règle de codage veut que l’on n’accède aux attributs de classes que par le nom de la classe</li>
  168. <li>On n’utilisera donc pas le nom des instances pour y accéder</li>
  169. </ul>
  170. <p>Au lieu d’écrire:</p>
  171. <div class="sourceCode" id="cb8"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb8-1" data-line-number="1">rendezVousA.<span class="fu">compteur</span> = <span class="dv">1</span>;</a></code></pre></div>
  172. <p>Ecrire:</p>
  173. <div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1">RendezVous.<span class="fu">compteur</span> = <span class="dv">1</span>;</a></code></pre></div>
  174. <h2 id="méthodes">Méthodes</h2>
  175. <p>Une méthode permet de définir un comportement, d’implémenter un algorithme.</p>
  176. <p>Elles sont de deux types:</p>
  177. <ul>
  178. <li>les méthodes d’instances, qui s’applique à une instance donnée</li>
  179. </ul>
  180. <p><em>Déclaration</em></p>
  181. <div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">class</span> RendezVous {</a>
  182. <a class="sourceLine" id="cb10-2" data-line-number="2"> <span class="dt">int</span> dureeEnHeure = <span class="dv">0</span>;</a>
  183. <a class="sourceLine" id="cb10-3" data-line-number="3"> <span class="dt">void</span> <span class="fu">incrementerDuree</span>(){</a>
  184. <a class="sourceLine" id="cb10-4" data-line-number="4"> dureeEnHeure ++ ;</a>
  185. <a class="sourceLine" id="cb10-5" data-line-number="5"> }</a>
  186. <a class="sourceLine" id="cb10-6" data-line-number="6">}</a></code></pre></div>
  187. <p><em>Utilisation</em></p>
  188. <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1">RendezVous rdv = <span class="kw">new</span> <span class="fu">RendezVous</span>();</a>
  189. <a class="sourceLine" id="cb11-2" data-line-number="2">rdv.<span class="fu">incrementerDuree</span>();</a></code></pre></div>
  190. <ul>
  191. <li>les méthodes de classe : elles sont accessibles directement à partir du nom de la classe.</li>
  192. </ul>
  193. <p><em>Déclaration</em></p>
  194. <div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">class</span> RendezVous{</a>
  195. <a class="sourceLine" id="cb12-2" data-line-number="2"> <span class="dt">static</span> <span class="dt">int</span> compteur = <span class="dv">0</span>;</a>
  196. <a class="sourceLine" id="cb12-3" data-line-number="3"></a>
  197. <a class="sourceLine" id="cb12-4" data-line-number="4"> <span class="fu">RendezVous</span>(){</a>
  198. <a class="sourceLine" id="cb12-5" data-line-number="5"> compteur++;</a>
  199. <a class="sourceLine" id="cb12-6" data-line-number="6"> }</a>
  200. <a class="sourceLine" id="cb12-7" data-line-number="7"></a>
  201. <a class="sourceLine" id="cb12-8" data-line-number="8"> <span class="dt">static</span> <span class="dt">int</span> <span class="fu">getNombreDInstances</span>(){</a>
  202. <a class="sourceLine" id="cb12-9" data-line-number="9"> <span class="kw">return</span> compteur;</a>
  203. <a class="sourceLine" id="cb12-10" data-line-number="10"> }</a>
  204. <a class="sourceLine" id="cb12-11" data-line-number="11">}</a></code></pre></div>
  205. <p><em>Utilisation</em></p>
  206. <div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="dt">int</span> valeur = RendezVous.<span class="fu">getNombreDInstances</span>();</a></code></pre></div>
  207. <h3 id="exercice-1">Exercice</h3>
  208. <p>Nous allons tester les attributs de classe.</p>
  209. <p>Pour cela, implémentez la classe <code>Forme</code> ci-dessus.</p>
  210. <p>Ajoutez une méthode dont la signature est la suivante:</p>
  211. <ul>
  212. <li><code>public static String getInformationNombreFormes()</code></li>
  213. </ul>
  214. <p>Cette méthode renvoie une chaîne de caractères de la forme suivante:</p>
  215. <p><code>&quot;Le nombre de formes instanciées est 3&quot;</code></p>
  216. <p>Où 3 est à remplacer par le compteur de formes.</p>
  217. <p>Ensuite, créer une classe principale <code>GenereForme</code> qui contiendra le code suivant:</p>
  218. <div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1">Forme f ;</a>
  219. <a class="sourceLine" id="cb14-2" data-line-number="2"></a>
  220. <a class="sourceLine" id="cb14-3" data-line-number="3">f = <span class="kw">new</span> <span class="fu">Forme</span>();</a>
  221. <a class="sourceLine" id="cb14-4" data-line-number="4">f = <span class="kw">new</span> <span class="fu">Forme</span>();</a>
  222. <a class="sourceLine" id="cb14-5" data-line-number="5"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(f.<span class="fu">getInformationNombreFormes</span>());</a>
  223. <a class="sourceLine" id="cb14-6" data-line-number="6">f = <span class="kw">new</span> <span class="fu">Forme</span>();</a>
  224. <a class="sourceLine" id="cb14-7" data-line-number="7">f = <span class="kw">new</span> <span class="fu">Forme</span>();</a>
  225. <a class="sourceLine" id="cb14-8" data-line-number="8"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(f.<span class="fu">getInformationNombreFormes</span>());</a></code></pre></div>
  226. <p>Que dire de la variable <code>f</code> qui est ici utilisée ?</p>
  227. <ul>
  228. <li>Quelles sont ses valeurs successives ?</li>
  229. <li>Que deviennent les valeurs précédentes ?</li>
  230. </ul>
  231. <p>En lançant ce programme, que constatez-vous ?</p>
  232. <h2 id="représentation-uml-des-membres">Représentation UML des membres</h2>
  233. <p>Diagramme de classe</p>
  234. <figure>
  235. <img src="images/RendezVous.png" alt="Diagramme de classe: RendezVous.png" /><figcaption>Diagramme de classe: RendezVous.png</figcaption>
  236. </figure>
  237. <h2 id="import-statique">Import statique</h2>
  238. <p>Normalement pour utiliser un membre d’une classe, il faut l’écrire explicitement:</p>
  239. <div class="sourceCode" id="cb15"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb15-1" data-line-number="1"><span class="dt">double</span> rayon = <span class="bu">Math</span>.<span class="fu">cos</span>(beta * <span class="bu">Math</span>.<span class="fu">PI</span>);</a></code></pre></div>
  240. <p>Les <em>static import</em> permettent d’utiliser directement depuis une autre classe des membres statiques d’une classe particulière.</p>
  241. <div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="kw">import static</span><span class="im"> java.lang.Math.PI;</span></a>
  242. <a class="sourceLine" id="cb16-2" data-line-number="2"><span class="kw">import static</span><span class="im"> java.lang.Math.cos;</span></a>
  243. <a class="sourceLine" id="cb16-3" data-line-number="3"></a>
  244. <a class="sourceLine" id="cb16-4" data-line-number="4">...</a>
  245. <a class="sourceLine" id="cb16-5" data-line-number="5"></a>
  246. <a class="sourceLine" id="cb16-6" data-line-number="6"><span class="dt">double</span> rayon = <span class="fu">cos</span>(beta * PI);</a></code></pre></div>
  247. <p><strong>ATTENTION</strong></p>
  248. <p>Ceci est à utiliser avec précaution et parcimonie !</p>
  249. <p>Il est facile de se retrouver avec des membres avec le même nom que ceux importés d’une autre classe.</p>
  250. <h2 id="constantes-et-le-mot-clé-final">Constantes et le mot clé ‘final’</h2>
  251. <p>Les constantes sont des attributs qui ne peuvent plus changer de valeur.</p>
  252. <p>Pour les définir on utilise le mot clé <code>final</code></p>
  253. <p>En fait, tout membre d’une classe ayant un attribut <code>final</code> ne pourra plus être modifié ou surchargé.</p>
  254. <p>Ainsi une méthode déclarée <code>final</code> ne pourra pas être surchargée par une classe qui hériterait de la classe courante.</p>
  255. <div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="kw">class</span> Polygone{</a>
  256. <a class="sourceLine" id="cb17-2" data-line-number="2"> <span class="bu">String</span> nom ;</a>
  257. <a class="sourceLine" id="cb17-3" data-line-number="3"> <span class="dt">final</span> <span class="dt">int</span> JE_NE_PEUX_PAS_CHANGER = <span class="dv">0</span>;</a>
  258. <a class="sourceLine" id="cb17-4" data-line-number="4"></a>
  259. <a class="sourceLine" id="cb17-5" data-line-number="5"> <span class="dt">final</span> <span class="bu">String</span> <span class="fu">getNom</span>(){</a>
  260. <a class="sourceLine" id="cb17-6" data-line-number="6"> <span class="kw">return</span> nom;</a>
  261. <a class="sourceLine" id="cb17-7" data-line-number="7"> }</a>
  262. <a class="sourceLine" id="cb17-8" data-line-number="8"></a>
  263. <a class="sourceLine" id="cb17-9" data-line-number="9"> <span class="dt">void</span> <span class="fu">changer</span>(){</a>
  264. <a class="sourceLine" id="cb17-10" data-line-number="10"> JE_NE_PEUX_PAS_CHANGER = <span class="dv">1</span> ; <span class="co">//ERREUR DE COMPILATION</span></a>
  265. <a class="sourceLine" id="cb17-11" data-line-number="11"> }</a>
  266. <a class="sourceLine" id="cb17-12" data-line-number="12">}</a>
  267. <a class="sourceLine" id="cb17-13" data-line-number="13"><span class="kw">class</span> Triangle <span class="kw">extends</span> Polygone{</a>
  268. <a class="sourceLine" id="cb17-14" data-line-number="14"> <span class="bu">String</span> <span class="fu">getNom</span>(){ <span class="co">// ERREUR de COMPILATION</span></a>
  269. <a class="sourceLine" id="cb17-15" data-line-number="15"> <span class="kw">return</span> <span class="st">&quot;Triangle.&quot;</span>+nom;</a>
  270. <a class="sourceLine" id="cb17-16" data-line-number="16"> }</a>
  271. <a class="sourceLine" id="cb17-17" data-line-number="17">}</a></code></pre></div>
  272. <h3 id="représentation-uml">Représentation UML</h3>
  273. <figure>
  274. <img src="images/Constantes.png" alt="Diagramme de classe: Constantes.png" /><figcaption>Diagramme de classe: Constantes.png</figcaption>
  275. </figure>
  276. <h2 id="conventions-de-codage">Conventions de codage</h2>
  277. <h3 id="définition">Définition</h3>
  278. <p>C’est un ensemble de règles qui permettent d’écrire un code dans une manière lisible et compréhensible par un maximum de développeurs.</p>
  279. <p>Ces règles évoluent d’un langage à l’autre. En Java, elles sont essentielles car elles permettent, d’un seul coup d’oeil, de déterminer si on a affaire à une classe/un type, une variable/attribut/paramètre ou une constante.</p>
  280. <p>Elles sont là pour améliorer la compréhension des éléments du code et faire en sorte qu’il soit “auto-commenté” le plus possible. C’est à dire que l’on va utiliser des noms qui soient parlant, que ce soit pour les méthodes, attributs, variables ou classes.</p>
  281. <p>Un lien vers les conventions de codage telles que définies aux origines du langage Java.</p>
  282. <p><a href="http://www.oracle.com/technetwork/java/codeconventions-150003.pdf" class="uri">http://www.oracle.com/technetwork/java/codeconventions-150003.pdf</a></p>
  283. <p>Autre lien avec quelques exemples:</p>
  284. <p><a href="https://en.wikibooks.org/wiki/Java_Programming/Coding_conventions" class="uri">https://en.wikibooks.org/wiki/Java_Programming/Coding_conventions</a> pour compléter vos connaissances.</p>
  285. <h3 id="règles-de-nommage">Règles de nommage</h3>
  286. <h4 id="les-mots-réservés">Les mots réservés</h4>
  287. <p>Les mots qu’il est interdit d’utiliser pour nommer une attribut, une méthode, une variable, un paramètre, une classe, etc, sont donnés à l’adresse suivante:</p>
  288. <p>https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html</p>
  289. <h4 id="comment-nommer-les-éléments-du-programme">Comment nommer les éléments du programme</h4>
  290. <p>Tous les composants d’un programme Java doivent être nommés.</p>
  291. <p>Ces noms sont donnés:</p>
  292. <ul>
  293. <li>aux classes,</li>
  294. <li>aux variables,</li>
  295. <li>aux paramètres,</li>
  296. <li>aux méthodes.</li>
  297. </ul>
  298. <p>Ces noms sont appelés des <strong>identifiants</strong>. Leur nom est sensible à la casse (différence majuscule/minuscule).</p>
  299. <p>Les règles pour définir un <strong>identifiant</strong> sont les suivantes:</p>
  300. <ul>
  301. <li>Chaque <strong>identifiant</strong> doit commencer par un premier caractère qui est:
  302. <ul>
  303. <li>soit une lettre (<code>a</code> à <code>z</code> ou <code>A</code> à <code>Z</code>),</li>
  304. <li>soit un <code>$</code>,</li>
  305. <li>soit un <em>underscore</em> <code>_</code>;</li>
  306. </ul></li>
  307. <li>Après le premier caractère, les identifiants peuvent contenir une combinaison de plusieurs autres caractères (incluant des chiffres);</li>
  308. <li>un mot clé (ou mot réservé) ne peut pas être utilisé comme identifiant;</li>
  309. </ul>
  310. <p>Exemples d’identifiants <strong>autorisés</strong>:</p>
  311. <ul>
  312. <li><code>age</code></li>
  313. <li><code>$distance</code></li>
  314. <li><code>_valeur</code></li>
  315. <li><code>__1_data</code></li>
  316. </ul>
  317. <p>Exemples d’identifiants <strong>incorrects</strong>:</p>
  318. <ul>
  319. <li><code>12singes</code></li>
  320. <li><code>-salaire</code></li>
  321. </ul>
  322. <p>En Java on utilise la notation <em>CamelCase</em> (casse en dos de chameau).</p>
  323. <p>Pour nommer un attribut, une méthode ou une classe, on l’écrit sous la forme de mots accolés, avec la première lettre du mot qui commence par une majuscule.</p>
  324. <p>La première lettre du premier mot est:</p>
  325. <ul>
  326. <li>minuscule pour les méthodes, attributs, variables et paramètres.</li>
  327. <li>majuscule pour les classes.</li>
  328. </ul>
  329. <p>Exemple:</p>
  330. <div class="sourceCode" id="cb18"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb18-1" data-line-number="1"><span class="kw">class</span> FormeSpeciale {</a>
  331. <a class="sourceLine" id="cb18-2" data-line-number="2"> <span class="bu">String</span> leNomDeCetteForme ;</a>
  332. <a class="sourceLine" id="cb18-3" data-line-number="3"></a>
  333. <a class="sourceLine" id="cb18-4" data-line-number="4"> <span class="dt">static</span> <span class="dt">final</span> <span class="dt">int</span> CODE_FORME = <span class="dv">3</span>;</a>
  334. <a class="sourceLine" id="cb18-5" data-line-number="5"></a>
  335. <a class="sourceLine" id="cb18-6" data-line-number="6"> <span class="bu">String</span> <span class="fu">getLeNomDeCetteForme</span>(){</a>
  336. <a class="sourceLine" id="cb18-7" data-line-number="7"> <span class="kw">return</span> leNomDeCetteForme;</a>
  337. <a class="sourceLine" id="cb18-8" data-line-number="8"> }</a>
  338. <a class="sourceLine" id="cb18-9" data-line-number="9"></a>
  339. <a class="sourceLine" id="cb18-10" data-line-number="10"> <span class="dt">void</span> <span class="fu">setLeNomDeCetteForme</span>(<span class="bu">String</span> nouveauNom){</a>
  340. <a class="sourceLine" id="cb18-11" data-line-number="11"> leNomDeCetteForme = nouveauNom;</a>
  341. <a class="sourceLine" id="cb18-12" data-line-number="12"> }</a></code></pre></div>
  342. <h4 id="pour-les-constantes">Pour les constantes</h4>
  343. <p>Pour les constantes on utilise une règle différente: majuscules avec des mots séparés par des tirets-bas (underscore).</p>
  344. <div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="dt">final</span> <span class="bu">String</span> MA_CONSTANTE = <span class="st">&quot;Je ne changerai jamais !&quot;</span></a></code></pre></div>
  345. <h2 id="contrôle-des-accès">Contrôle des accès</h2>
  346. <p>Les classes, attributs ou méthodes peuvent être accessibles (on dit aussi visibles) ou non à l’intérieur d’autres classes, qu’elles soient du même package ou pas.</p>
  347. <p>Pour indiquer les degrés d’accessibilités on utilise des modificateurs d’accessibilité (<em>access modifiers</em>).</p>
  348. <p>On utilise pour cela ces trois mots clés:</p>
  349. <ul>
  350. <li><code>private</code></li>
  351. <li><code>protected</code></li>
  352. <li><code>public</code></li>
  353. </ul>
  354. <table>
  355. <colgroup>
  356. <col style="width: 33%" />
  357. <col style="width: 33%" />
  358. <col style="width: 33%" />
  359. </colgroup>
  360. <thead>
  361. <tr class="header">
  362. <th>Modificateur</th>
  363. <th>Applicable à</th>
  364. <th>Signification</th>
  365. </tr>
  366. </thead>
  367. <tbody>
  368. <tr class="odd">
  369. <td><code>public</code></td>
  370. <td>classe</td>
  371. <td>est visible partout</td>
  372. </tr>
  373. <tr class="even">
  374. <td><code>public</code></td>
  375. <td>membre (méthode ou attribut)</td>
  376. <td>visible partout où sa classe est visible</td>
  377. </tr>
  378. <tr class="odd">
  379. <td><em>par défaut (sans modificateur)</em></td>
  380. <td>classe ou membre</td>
  381. <td>seulement à l’intérieur de son package</td>
  382. </tr>
  383. <tr class="even">
  384. <td><code>protected</code></td>
  385. <td>méthode ou attribut</td>
  386. <td>à l’intérieur du package ou par les classes dérivées</td>
  387. </tr>
  388. <tr class="odd">
  389. <td><code>private</code></td>
  390. <td>méthode ou attribut</td>
  391. <td>uniquement à l’intérieur de la classe</td>
  392. </tr>
  393. </tbody>
  394. </table>
  395. <h3 id="représentation-uml-1">Représentation UML</h3>
  396. <figure>
  397. <img src="images/Access-Modifiers-reference.png" alt="Diagramme de classe: Modificateurs d’accès" /><figcaption>Diagramme de classe: Modificateurs d’accès</figcaption>
  398. </figure>
  399. <h2 id="encapsulation">Encapsulation</h2>
  400. <p>L’intérêt des modificateurs d’accès est de permettre de contrôler l’accès aux membres de la classe depuis d’autres classes (ou leurs instances, les objets).</p>
  401. <p>En effet, lorsqu’on exécute un programme, il n’est pas souhaitable que des objets viennent modifier le comportement interne d’un autre objet. Cela pourrait engendrer des comportements indésirables.</p>
  402. <p>On souhaite donc isoler certains membres d’un objet de l’extérieur afin qu’il soit inaccessibles.</p>
  403. <p>On appelle ceci l’<strong>encapsulation</strong>. C’est un des concepts <strong>fondamentaux</strong> de la POO.</p>
  404. <h3 id="encapsulation-des-calculs">Encapsulation des calculs</h3>
  405. <p>Reprenons les classes développées pour les calculs arithmétiques.</p>
  406. <p>La classe <code>Calcul</code> contient un résultat. Comment isoler ce résultat de l’extérieur pour qu’il ne soit pas modifiable ?</p>
  407. <p>Comment le rendre accessible pour que l’on puisse en connaître la valeur ?</p>
  408. <p>Une solution : on encapsule l’attribut <code>resultat</code> et on lui ajoute des <strong>accesseurs</strong>.</p>
  409. <p>Les accesseurs sont aussi appelés:</p>
  410. <ul>
  411. <li><code>getter</code>
  412. <ul>
  413. <li>commence en général par la chaîne <code>get</code></li>
  414. <li>permet de récupérer la valeur de l’attribut</li>
  415. </ul></li>
  416. <li><code>setter</code>
  417. <ul>
  418. <li>commence en général par la chaîne <code>set</code></li>
  419. <li>permet d’affecter/modifier une valeur</li>
  420. </ul></li>
  421. </ul>
  422. <p>Utilisez le code suivant et essayez de compiler votre programme:</p>
  423. <div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="kw">public</span> <span class="kw">abstract</span> <span class="kw">class</span> Calcul {</a>
  424. <a class="sourceLine" id="cb20-2" data-line-number="2"> <span class="kw">private</span> <span class="dt">int</span> resultat ;</a>
  425. <a class="sourceLine" id="cb20-3" data-line-number="3"> <span class="kw">public</span> <span class="kw">abstract</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">int</span> a, <span class="dt">int</span> b);</a>
  426. <a class="sourceLine" id="cb20-4" data-line-number="4"></a>
  427. <a class="sourceLine" id="cb20-5" data-line-number="5"> <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getResultat</span>() {</a>
  428. <a class="sourceLine" id="cb20-6" data-line-number="6"> <span class="kw">return</span> resultat;</a>
  429. <a class="sourceLine" id="cb20-7" data-line-number="7"> }</a>
  430. <a class="sourceLine" id="cb20-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setResultat</span>(<span class="dt">int</span> r) {</a>
  431. <a class="sourceLine" id="cb20-9" data-line-number="9"> resultat = r;</a>
  432. <a class="sourceLine" id="cb20-10" data-line-number="10"> }</a>
  433. <a class="sourceLine" id="cb20-11" data-line-number="11"></a>
  434. <a class="sourceLine" id="cb20-12" data-line-number="12"> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>() {</a>
  435. <a class="sourceLine" id="cb20-13" data-line-number="13"> <span class="kw">return</span> <span class="st">&quot;Le résultat de l&#39;opération &quot;</span>+<span class="fu">getClass</span>().<span class="fu">getSimpleName</span>()+<span class="st">&quot;&quot;</span>;</a>
  436. <a class="sourceLine" id="cb20-14" data-line-number="14"> }</a>
  437. <a class="sourceLine" id="cb20-15" data-line-number="15">}</a></code></pre></div>
  438. <p>On constate que certaines classes contiennent des erreurs de compilation.</p>
  439. <h4 id="setter">Setter</h4>
  440. <p>Ainsi, la ligne suivante pose problème :</p>
  441. <div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1">resultat = a * b;</a></code></pre></div>
  442. <p>Utilisons l’accesseur commençant par <code>set</code> (on l’appelle aussi <strong>setter</strong>) :</p>
  443. <div class="sourceCode" id="cb22"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb22-1" data-line-number="1"><span class="fu">setResultat</span>(a * b);</a></code></pre></div>
  444. <h4 id="getter">Getter</h4>
  445. <p>Idem pour la ligne suivante:</p>
  446. <div class="sourceCode" id="cb23"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb23-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">resultat</span>);</a></code></pre></div>
  447. <p>Utilisons l’accesseur commençant par <code>get</code> (on l’appelle aussi <strong>getter</strong>) :</p>
  448. <div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(premierCalcul.<span class="fu">getResultat</span>());</a></code></pre></div>
  449. <h4 id="attribut-privé-attribut-protégé">Attribut privé, attribut protégé ?</h4>
  450. <p>L’attribut <code>resultat</code> est désormais inaccessible depuis toute classe qui n’est pas <code>Calcul</code>.</p>
  451. <p>Il est donc protégé de toute modification extérieure. La classe contrôle ce qui peut être définit sur cet attribut.</p>
  452. <p>Pourtant, si on observe attentivement, on constate que n’importe quelle classe peut appeler la méthode <code>setResultat()</code>.</p>
  453. <p>Est-ce souhaitable ?</p>
  454. <p>Quel modificateur d’accès utiliser pour remédier à cela parmi ceux vus précédemments ?</p>
  455. <p>Sur quel membre le placer ?</p>
  456. <h4 id="pas-de-setter">Pas de setter</h4>
  457. <p>On souhaite se débarrasser du <em>setter</em> : en effet, il n’est pas souhaitable que le résultat soit modifiable de l’extérieur.</p>
  458. <p>Ainsi dans la classe <code>Addition</code> (par exemple), on veut que le code suivant fonctionne:</p>
  459. <div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1">resultat = a + b;</a></code></pre></div>
  460. <p>Comment faire ?</p>
  461. <h4 id="uml">UML</h4>
  462. <p>Dessinez la représentation UML de <code>Calcul</code> et de ses sous-classes.</p>
  463. <h3 id="application-1">Application 1</h3>
  464. <p>Nous allons créer les classes suivantes dans le paquet <code>com.example.java.voyage</code>.</p>
  465. <p>Des erreurs vont apparaître dans le code.</p>
  466. <p>Commentez en indiquant pour chaque ligne:</p>
  467. <ul>
  468. <li>Si le membre est accessible</li>
  469. <li>Si une erreur de compilation se produit</li>
  470. </ul>
  471. <p>Corrigez l’erreur en :</p>
  472. <ul>
  473. <li>commentant la ligne si le membre ne peut pas être accédé (ajouter le pourquoi en commentaire)</li>
  474. <li>remplaçant le membre par un accesseur si celui-ci est disponible</li>
  475. </ul>
  476. <p>Note:</p>
  477. <p>Un accesseur est une méthode permettant d’accéder ou de modifier la valeur d’un attribut</p>
  478. <p>Vous pouvez expérimenter dans votre IDE.</p>
  479. <p>Dans le fichier <code>Trousse.java</code>:</p>
  480. <div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span></a>
  481. <a class="sourceLine" id="cb26-2" data-line-number="2"></a>
  482. <a class="sourceLine" id="cb26-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Trousse { <span class="co">/* La classe est visible partout */</span></a>
  483. <a class="sourceLine" id="cb26-4" data-line-number="4"></a>
  484. <a class="sourceLine" id="cb26-5" data-line-number="5"> <span class="kw">public</span> <span class="bu">String</span> publique ; <span class="co">/* Est visible partout où sa classe est visible*/</span></a>
  485. <a class="sourceLine" id="cb26-6" data-line-number="6"> <span class="kw">protected</span> <span class="dt">int</span> protege ;</a>
  486. <a class="sourceLine" id="cb26-7" data-line-number="7"></a>
  487. <a class="sourceLine" id="cb26-8" data-line-number="8"> <span class="dt">int</span> defaut;</a>
  488. <a class="sourceLine" id="cb26-9" data-line-number="9"> <span class="kw">private</span> <span class="dt">int</span> prive;</a>
  489. <a class="sourceLine" id="cb26-10" data-line-number="10"></a>
  490. <a class="sourceLine" id="cb26-11" data-line-number="11"> <span class="fu">Trousse</span>(<span class="bu">String</span> valPub, <span class="dt">int</span> valProt, <span class="dt">int</span> valDef, <span class="dt">int</span> valPriv){</a>
  491. <a class="sourceLine" id="cb26-12" data-line-number="12"> publique = valPub;</a>
  492. <a class="sourceLine" id="cb26-13" data-line-number="13"> protege = valProt;</a>
  493. <a class="sourceLine" id="cb26-14" data-line-number="14"> defaut = valDef;</a>
  494. <a class="sourceLine" id="cb26-15" data-line-number="15"> prive = valPriv;</a>
  495. <a class="sourceLine" id="cb26-16" data-line-number="16"> }</a>
  496. <a class="sourceLine" id="cb26-17" data-line-number="17"> <span class="fu">Trousse</span>(){</a>
  497. <a class="sourceLine" id="cb26-18" data-line-number="18"> <span class="co">/* ... */</span></a>
  498. <a class="sourceLine" id="cb26-19" data-line-number="19"> }</a>
  499. <a class="sourceLine" id="cb26-20" data-line-number="20"></a>
  500. <a class="sourceLine" id="cb26-21" data-line-number="21"> <span class="co">/**</span> Accesseur public <span class="co">*/</span></a>
  501. <a class="sourceLine" id="cb26-22" data-line-number="22"> <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getProtege</span>(){</a>
  502. <a class="sourceLine" id="cb26-23" data-line-number="23"> <span class="kw">return</span> protege;</a>
  503. <a class="sourceLine" id="cb26-24" data-line-number="24"> }</a>
  504. <a class="sourceLine" id="cb26-25" data-line-number="25"> <span class="co">/**</span> Accesseur public <span class="co">*/</span></a>
  505. <a class="sourceLine" id="cb26-26" data-line-number="26"> <span class="kw">public</span> <span class="dt">int</span> <span class="fu">getPrive</span>(){</a>
  506. <a class="sourceLine" id="cb26-27" data-line-number="27"> <span class="kw">return</span> prive;</a>
  507. <a class="sourceLine" id="cb26-28" data-line-number="28"> }</a>
  508. <a class="sourceLine" id="cb26-29" data-line-number="29">}</a></code></pre></div>
  509. <p>Dans le fichier <code>SacDeVoyage.java</code> :</p>
  510. <div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span> <span class="co">//Meme paquet que Trousse</span></a>
  511. <a class="sourceLine" id="cb27-2" data-line-number="2"></a>
  512. <a class="sourceLine" id="cb27-3" data-line-number="3"><span class="kw">class</span> SacDeVoyage {</a>
  513. <a class="sourceLine" id="cb27-4" data-line-number="4"> Trousse trousse = <span class="kw">new</span> <span class="fu">Trousse</span>();</a>
  514. <a class="sourceLine" id="cb27-5" data-line-number="5"> <span class="dt">int</span> entier;</a>
  515. <a class="sourceLine" id="cb27-6" data-line-number="6"> <span class="bu">String</span> chaine;</a>
  516. <a class="sourceLine" id="cb27-7" data-line-number="7"></a>
  517. <a class="sourceLine" id="cb27-8" data-line-number="8"> <span class="fu">SacDeVoyage</span>(){</a>
  518. <a class="sourceLine" id="cb27-9" data-line-number="9"> chaine = trousse.<span class="fu">publique</span>;</a>
  519. <a class="sourceLine" id="cb27-10" data-line-number="10"> entier = trousse.<span class="fu">protege</span>;</a>
  520. <a class="sourceLine" id="cb27-11" data-line-number="11"> entier = trousse.<span class="fu">getProtege</span>();</a>
  521. <a class="sourceLine" id="cb27-12" data-line-number="12"> entier = trousse.<span class="fu">defaut</span>;</a>
  522. <a class="sourceLine" id="cb27-13" data-line-number="13"> entier = trousse.<span class="fu">prive</span> ;</a>
  523. <a class="sourceLine" id="cb27-14" data-line-number="14"> entier = trousse.<span class="fu">getPrive</span>();</a>
  524. <a class="sourceLine" id="cb27-15" data-line-number="15"> }</a>
  525. <a class="sourceLine" id="cb27-16" data-line-number="16">}</a></code></pre></div>
  526. <p>Dans le fichier <code>TrousseDeToilette.java</code> :</p>
  527. <div class="sourceCode" id="cb28"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb28-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.voyage;</span></a>
  528. <a class="sourceLine" id="cb28-2" data-line-number="2"></a>
  529. <a class="sourceLine" id="cb28-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> TrousseDeToilette <span class="kw">extends</span> Trousse {</a>
  530. <a class="sourceLine" id="cb28-4" data-line-number="4"> <span class="dt">int</span> autreEntier ;</a>
  531. <a class="sourceLine" id="cb28-5" data-line-number="5"> <span class="bu">String</span> autreChaine ;</a>
  532. <a class="sourceLine" id="cb28-6" data-line-number="6"> <span class="kw">public</span> <span class="fu">TrousseDeToilette</span>() {</a>
  533. <a class="sourceLine" id="cb28-7" data-line-number="7"> autreChaine = publique;</a>
  534. <a class="sourceLine" id="cb28-8" data-line-number="8"> autreEntier = protege ;</a>
  535. <a class="sourceLine" id="cb28-9" data-line-number="9"> autreEntier = defaut;</a>
  536. <a class="sourceLine" id="cb28-10" data-line-number="10"> autreEntier = prive ;</a>
  537. <a class="sourceLine" id="cb28-11" data-line-number="11"> autreEntier = <span class="fu">getPrive</span>();</a>
  538. <a class="sourceLine" id="cb28-12" data-line-number="12"> }</a>
  539. <a class="sourceLine" id="cb28-13" data-line-number="13">}</a></code></pre></div>
  540. <p>Nous allons créer la classe suivante dans le paquet <code>com.example.java.transport</code>.</p>
  541. <div class="sourceCode" id="cb29"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb29-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.transport;</span> <span class="co">//Un autre paquet</span></a>
  542. <a class="sourceLine" id="cb29-2" data-line-number="2"></a>
  543. <a class="sourceLine" id="cb29-3" data-line-number="3"><span class="kw">import</span><span class="im"> com.example.java.voyage.Trousse;</span> <span class="co">//import de Trousse</span></a>
  544. <a class="sourceLine" id="cb29-4" data-line-number="4"><span class="kw">class</span> Voiture {</a>
  545. <a class="sourceLine" id="cb29-5" data-line-number="5"> Trousse trousse = <span class="kw">new</span> <span class="fu">Trousse</span>();</a>
  546. <a class="sourceLine" id="cb29-6" data-line-number="6"> <span class="dt">int</span> entier;</a>
  547. <a class="sourceLine" id="cb29-7" data-line-number="7"> <span class="bu">String</span> chaine;</a>
  548. <a class="sourceLine" id="cb29-8" data-line-number="8"></a>
  549. <a class="sourceLine" id="cb29-9" data-line-number="9"> <span class="fu">Voiture</span>(){</a>
  550. <a class="sourceLine" id="cb29-10" data-line-number="10"> chaine = trousse.<span class="fu">publique</span>;</a>
  551. <a class="sourceLine" id="cb29-11" data-line-number="11"> entier = trousse.<span class="fu">protege</span>;</a>
  552. <a class="sourceLine" id="cb29-12" data-line-number="12"> entier = trousse.<span class="fu">getProtege</span>();</a>
  553. <a class="sourceLine" id="cb29-13" data-line-number="13"> entier = trousse.<span class="fu">defaut</span>;</a>
  554. <a class="sourceLine" id="cb29-14" data-line-number="14"> entier = trousse.<span class="fu">prive</span> ;</a>
  555. <a class="sourceLine" id="cb29-15" data-line-number="15"> entier = trousse.<span class="fu">getPrive</span>();</a>
  556. <a class="sourceLine" id="cb29-16" data-line-number="16"> }</a>
  557. <a class="sourceLine" id="cb29-17" data-line-number="17">}</a></code></pre></div>
  558. <p>Puis la classe <code>TroussePremierSecours</code> :</p>
  559. <div class="sourceCode" id="cb30"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb30-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.java.transport;</span></a>
  560. <a class="sourceLine" id="cb30-2" data-line-number="2"></a>
  561. <a class="sourceLine" id="cb30-3" data-line-number="3"><span class="kw">import</span><span class="im"> com.example.java.voyage.Trousse;</span></a>
  562. <a class="sourceLine" id="cb30-4" data-line-number="4"></a>
  563. <a class="sourceLine" id="cb30-5" data-line-number="5"><span class="kw">public</span> <span class="kw">class</span> TroussePremierSecours <span class="kw">extends</span> Trousse {</a>
  564. <a class="sourceLine" id="cb30-6" data-line-number="6"> <span class="fu">TroussePremierSecours</span>(){</a>
  565. <a class="sourceLine" id="cb30-7" data-line-number="7"> <span class="bu">String</span> chaine = publique;</a>
  566. <a class="sourceLine" id="cb30-8" data-line-number="8"> <span class="dt">int</span> entier = protege;</a>
  567. <a class="sourceLine" id="cb30-9" data-line-number="9"> entier = <span class="fu">getProtege</span>();</a>
  568. <a class="sourceLine" id="cb30-10" data-line-number="10"> entier = defaut;</a>
  569. <a class="sourceLine" id="cb30-11" data-line-number="11"> entier = prive ;</a>
  570. <a class="sourceLine" id="cb30-12" data-line-number="12"> entier = <span class="fu">getPrive</span>();</a>
  571. <a class="sourceLine" id="cb30-13" data-line-number="13"> }</a>
  572. <a class="sourceLine" id="cb30-14" data-line-number="14">}</a></code></pre></div>
  573. <p>Corrigez toutes les erreurs (et expliquez en commentaire ce <strong>que vous avez fait</strong> et <strong>pourquoi</strong>) :</p>
  574. <ul>
  575. <li>en ajoutant des accesseurs</li>
  576. <li>ou en commentant les lignes contenant une erreur impossible à corriger.</li>
  577. </ul>
  578. <p>Dessinez la représentation UML des classes ainsi corrigées</p>
  579. <h3 id="le-mot-clé-this">Le mot clé this</h3>
  580. <p>Ce mot clé est très utile dans le cadre des <code>setters</code>.</p>
  581. <p>En effet, dans la méthode <code>setData(String data)</code> suivante, comment accéder à l’attribut de l’objet <code>data</code> sachant que celui-ci est <em>masqué</em> par l’identifiant du paramètre <code>data</code> ?</p>
  582. <div class="sourceCode" id="cb31"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb31-1" data-line-number="1"><span class="kw">class</span> Information{</a>
  583. <a class="sourceLine" id="cb31-2" data-line-number="2"> <span class="kw">private</span> <span class="bu">String</span> data ; <span class="co">//attribut</span></a>
  584. <a class="sourceLine" id="cb31-3" data-line-number="3"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">setData</span>(<span class="bu">String</span> data){ <span class="co">//data est un paramètre</span></a>
  585. <a class="sourceLine" id="cb31-4" data-line-number="4"> data = data ; <span class="co">// !!!</span></a>
  586. <a class="sourceLine" id="cb31-5" data-line-number="5"> }</a>
  587. <a class="sourceLine" id="cb31-6" data-line-number="6"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">getData</span>(){</a>
  588. <a class="sourceLine" id="cb31-7" data-line-number="7"> <span class="kw">return</span> data ; <span class="co">// on renvoie la valeur de l attribut data</span></a>
  589. <a class="sourceLine" id="cb31-8" data-line-number="8"> }</a>
  590. <a class="sourceLine" id="cb31-9" data-line-number="9">}</a></code></pre></div>
  591. <p>L’appel à <code>data</code> correspond ici uniquement au paramètre nommé <code>data</code>.</p>
  592. <p>Pour accéder à l’attribut, on le fait précéder du mot clé <code>this</code>.</p>
  593. <div class="sourceCode" id="cb32"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb32-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">setData</span>(<span class="bu">String</span> data){ <span class="co">//data est un paramètre</span></a>
  594. <a class="sourceLine" id="cb32-2" data-line-number="2"> <span class="kw">this</span>.<span class="fu">data</span> = data ; <span class="co">// !!!</span></a>
  595. <a class="sourceLine" id="cb32-3" data-line-number="3">}</a></code></pre></div>
  596. <p><code>this</code> pointe vers l’instance de l’objet sur lequel s’applique la méthode.</p>
  597. <p>Même si <code>data</code> est privé, on a le droit d’y accéder ici, puisqu’on le fait depuis l’intérieur de la classe.</p>
  598. <h3 id="application-2">Application 2</h3>
  599. <p>Reprendre la classe <code>Personne</code> et rendre tous ses attributs inaccessibles depuis l’extérieur.</p>
  600. <p>Mettre des <em>getters</em> pour tous les attributs.</p>
  601. <p>Mettre des <em>setters</em> pour tous les attributs sauf <code>nom</code>, <code>prenom</code> et <code>dateNaissance</code>.</p>
  602. <p>Ces trois attributs devront être positionnés/modifiés via un autre moyen que les accesseurs. Lequel ?</p>
  603. <p>Est-ce logique de faire ainsi ?</p>
  604. <h2 id="transtypage">Transtypage</h2>
  605. <p>Il est parfois nécessaire de convertir un type en un autre. Par exemple, on peut souhaiter convertir un entier en double.</p>
  606. <div class="sourceCode" id="cb33"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb33-1" data-line-number="1"><span class="dt">int</span> entier = <span class="dv">4</span> ;</a>
  607. <a class="sourceLine" id="cb33-2" data-line-number="2"><span class="dt">double</span> doublePrecision = <span class="fl">0.0</span>;</a>
  608. <a class="sourceLine" id="cb33-3" data-line-number="3"></a>
  609. <a class="sourceLine" id="cb33-4" data-line-number="4">doublePrecision = entier ; <span class="co">//Erreur de compilation</span></a></code></pre></div>
  610. <p>Le compilateur ne laisse pas passer ce genre d’erreur. Pour remédier à cela, on utilise le <code>transtypage</code> (on utilise aussi le mot <code>cast</code>):</p>
  611. <div class="sourceCode" id="cb34"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb34-1" data-line-number="1"><span class="dt">int</span> entier = <span class="dv">4</span> ;</a>
  612. <a class="sourceLine" id="cb34-2" data-line-number="2"><span class="dt">double</span> doublePrecision = <span class="fl">0.0</span>;</a>
  613. <a class="sourceLine" id="cb34-3" data-line-number="3"></a>
  614. <a class="sourceLine" id="cb34-4" data-line-number="4">doublePrecision = (<span class="dt">double</span>) entier ;</a></code></pre></div>
  615. <p>Il est possible de faire cela avec des objets:</p>
  616. <div class="sourceCode" id="cb35"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb35-1" data-line-number="1">Calcul calcul = <span class="kw">new</span> <span class="fu">Addition</span>();</a>
  617. <a class="sourceLine" id="cb35-2" data-line-number="2"></a>
  618. <a class="sourceLine" id="cb35-3" data-line-number="3">Addition addition = (Addition) calcul;</a>
  619. <a class="sourceLine" id="cb35-4" data-line-number="4"></a>
  620. <a class="sourceLine" id="cb35-5" data-line-number="5">addition.<span class="fu">calculer</span>(<span class="dv">3</span>, <span class="dv">4</span>);</a></code></pre></div>
  621. <h2 id="exercices">Exercices</h2>
  622. <h3 id="point">Point</h3>
  623. <p>Voici un diagramme de classe :</p>
  624. <figure>
  625. <img src="images/Point.png" alt="Diagramme de classe: Point.png" /><figcaption>Diagramme de classe: Point.png</figcaption>
  626. </figure>
  627. <h4 id="exercice-1-définition-de-la-classe-point">Exercice 1: définition de la classe Point</h4>
  628. <p>Dans ce qui suit, pour réaliser des calculs de distance, vous pouvez utiliser la classe <code>Math</code> (en utilisant éventuellement les <code>static import</code>).</p>
  629. <ol type="1">
  630. <li>Ecrire la classe <code>Point</code> qui décrit un point dans un repère en 2 dimensions avec des coordonnées entières (abscisse et ordonnée) et un nom (non modifiable).</li>
  631. </ol>
  632. <p>Les informations du point doivent être encapsulées et en lecture seule (<code>getter</code> uniquement). On autorise ainsi la modification des coordonnées du point uniquement par le biais de la méthode translater. 2. Ajouter un constructeur complet qui prend en paramètres le nom et les coordonnées du point. 3. Vérifier que vous ne pouvez pas modifier le nom en dehors du constructeur. Pour cela rajouter un <code>setter</code> sur cet attribut et compiler la classe Point. 4. Implémenter le code des deux méthodes de la classe <code>Point</code>:</p>
  633. <ul>
  634. <li><code>distance(...)</code> : renvoie la distance de l’instance courante à celle d’un autre point passé en paramètre,</li>
  635. <li><code>translater(...)</code> : translate l’instance courante d’un vecteur de déplacement passé en paramètre.</li>
  636. </ul>
  637. <ol start="5" type="1">
  638. <li>Ajouter une méthode <code>String toString()</code> permettant de représenter l’instance de <code>Point</code> par une chaîne de caractères de la forme <code>nom(abscisse, ordonnee)</code>.</li>
  639. </ol>
  640. <h4 id="exercice-2-utilisation-de-la-classe-point">Exercice 2: utilisation de la classe Point</h4>
  641. <ol type="1">
  642. <li>Créer une classe <code>ApplicationPoint</code> pour tester votre classe <code>Point</code> : le programme crée un point A de coordonnées (3, 5) et l’affiche sur la console.</li>
  643. <li>Translater le point A d’un vecteur (4, -3) et l’afficher à nouveau.</li>
  644. <li>Créer un deuxième point B de coordonnées (3, 5), calculer sa distance avec le point A et l’afficher.</li>
  645. </ol>
  646. <p>Prenez le soin de vérifier les valeurs données par le programme.</p>
  647. </body>
  648. </html>