URL: https://linuxfr.org/news/sortie-d-openjdk-13 Title: Sortie d’OpenJDK 13 Authors: Nonolapéro ZeroHeure, theojouedubanjo, Ysabeau, Davy Defaud, Cetera, xof et Julien Jorge Date: 2019-09-19T11:44:11+02:00 License: CC By-SA Tags: java et openjdk Score: 48 Le 17 septembre 2019 est sortie cette nouvelle version d’OpenJDK. Elle comporte son lot de nouveautés, de fonctionnalités en préversion et des retraits. C’est aussi l’occasion de réécriture de certains composants, notamment [l’API Socket](https://openjdk.java.net/jeps/353) pour l’inclusion des fils d’exécution — _threads_ — locaux (_aka_ [Fibers](https://openjdk.java.net/projects/loom/)). Les notes de version vous permettront d’avoir plus de détails. ---- [Notes de version](https://jdk.java.net/13/release-notes) [AdoptOpenJDK](https://adoptopenjdk.net/) [Vidéo sur les dernières nouveautés et celles à venir](https://www.youtube.com/watch?v=HrQWyS1EGLU) ---- # Dynamique de développement # ## Contributions ## Bien qu’Oracle reste le principal contributeur au projet, depuis les dernières versions, Red Hat et d’autres sociétés prennent en charge une part significative du travail, aux environs de 30 % des tickets pour la version 13. Plus de détails dans les billets du blog d’Oracle concernant la sortie des versions [12](https://blogs.oracle.com/java-platform-group/the-arrival-of-java-12) et [13](https://blogs.oracle.com/java-platform-group/the-arrival-of-java-13). ## Rythme de publication et durée de maintenance ## Depuis la sortie d’OpenJDK 9, le rythme de publication est passé à une version tous les six mois avec une maintenance raccourcie pour les versions sans support étendu (actuellement 9, 10, 12 et 13). À l’heure actuelle, les versions 8 et 11 ont un support de longue durée. Selon les distributions du JDK (Red Hat, IBM, Azul, Amazon, etc.) c’est encore différent. # Dans les épisodes précédents # ## Quelques nouveautés apparues ## ### Mot clef « var » ### La version 10 a vu l’apparition du mot clef `var` qui permet l’inférence de type et dont l’usage a été étendu aux [expressions lambda](https://fr.wikipedia.org/wiki/Lambda-calcul) dans la version 11. Cela permet de ne pas avoir à déclarer le type s’il est évident ou d’avoir à écrire un type trop verbeux. Il existe une liste de bonnes pratiques ([ici](https://openjdk.java.net/projects/amber/LVTIstyle.html) ou [là](https://openjdk.java.net/projects/amber/LVTIFAQ.html)) pour éviter de rendre le code illisible. ### Nouvelle méthode pour les collecteurs « Collectors::teeing » ### Depuis la version 12, la méthode statique `Collectors::teeing` permet de récupérer dans un flux deux informations différentes et ensuite d’appeler une méthode pour exploiter les données obtenues. [Cet article](https://blog.codefx.org/java/teeing-collector/) en anglais apporte plus de détails. # Nouveautés # Dans cette version les évolutions définitives sont principalement des mises à jour côté sécurité, des correctifs divers et variés ainsi que des améliorations de la machine virtuelle Java (JVM). ## Dynamic CDS Archive [JEP 350](https://openjdk.java.net/jeps/350) ## C’est une extension d’un module libéré par Oracle dans le JDK 10 (_Application Class‑Data Sharing_ [JEP 310](https://openjdk.java.net/jeps/310)). Ce module permet des temps de chargement raccourcis et une empreinte mémoire plus faible en partageant certaines classes entre les processus Java. Cette extension simplifie l’usage du module grâce à quelques options : * archivage à l’arrêt ; * chargement d’une archive au démarrage. ## ZGC : uncommit unused memory ## ZGC est un ramasse‑miettes expérimental à faible latence. Il est présent depuis le JDK 11. Désormais, la mémoire peut être rendue au système d’exploitation en configurant les options. C’est bien pratique puisque désormais la taille maximale du [tas](https://fr.wikipedia.org/wiki/Tas_(allocation_dynamique)) (_heap_) est passée de 4 à 16 Tio. ## Divers ## Intégration d’Unicode 12.1, vous pourrez désormais avoir un émoji [gilet jaune](https://emojipedia.org/safety-vest/). Pour les personnes plus versées dans les aspects sécurité, la lecture du [blog de Sean Mullan](https://seanjmullan.org/blog/2019/08/05/jdk13) est une bonne chose. # Nouveautés en préversion # Il s’agit de fonctionnalités à découvrir et qui nécessitent une activation à la compilation. Elles sont d’ailleurs amenées à ne pas rester en l’état. Par exemple, les _switch expressions_ en sont à leur seconde itération. ## Expressions switch ## Cette fonctionnalité est définie par la [JEP 325](http://openjdk.java.net/jeps/325). Il s’agit d’une des solutions pour rendre le code Java moins verbeux, et donc limiter le risque d’erreurs. Ainsi, le code : ```java switch (day) { case MONDAY: case FRIDAY: case SUNDAY: System.out.println(6); break; case TUESDAY: System.out.println(7); break; case THURSDAY: case SATURDAY: System.out.println(8); break; case WEDNESDAY: System.out.println(9); break; } ``` Peut désormais s’écrire de la manière suivante : ```java switch (day) { case MONDAY, FRIDAY, SUNDAY -> System.out.println(6); case TUESDAY -> System.out.println(7); case THURSDAY, SATURDAY -> System.out.println(8); case WEDNESDAY -> System.out.println(9); } ``` Ou encore si l’on veut affecter un résultat à une variable : ```java int numberOfLetters = switch (dayOfWeek) { case MONDAY: case FRIDAY: case SUNDAY: yield 6; case TUESDAY yield 7; case THURSDAY case SATURDAY yield 8; case WEDNESDAY yield 9; default: throw new IllegalStateException("Huh?: " + day); }; ``` ## Text Block ## Cette fonctionnalité est définie par la [JEP 355](http://openjdk.java.net/jeps/355). Les blocs de texte étaient initialement prévus pour la version 12 du JDK, mais au dernier moment ils ont été retirés faute de consensus sur le délimiteur et le comportement. L’idée est d’avoir du texte dont il est préférable de conserver le formatage pour des raisons de facilité d’écriture. Par exemple, au lieu d’écrire : ```java String html = "\n" + " \n" + "

Hello, world

\n" + " \n" + "\n"; String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" + "WHERE `CITY` = 'INDIANAPOLIS'\n" + "ORDER BY `EMP_ID`, `LAST_NAME`;\n"; ``` Il est possible d’écrire : ```java String html = """

Hello, world

"""; String query = """ SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB` WHERE `CITY` = 'INDIANAPOLIS' ORDER BY `EMP_ID`, `LAST_NAME`; """; ``` Ce [guide exhaustif en anglais](http://cr.openjdk.java.net/~jlaskey/Strings/TextBlocksGuide_v9.html) à destination des développeurs décrit les cas d’usage avec les bonnes et les mauvaises pratiques. # Futur # Avec le nouveau rythme de publication des JDK, les nouveautés arrivent de manière plus progressive. Ainsi, dans les prochaines versions, voici les améliorations qui devraient rendre le langage meilleur : * les _[Records](https://openjdk.java.net/jeps/359)_, qui seront une sorte de _data class_ telle que présente dans d’autres langages ; * les _[Sealed type](https://openjdk.java.net/jeps/360)_, qui seront des types algébriques permettant de restreindre les possibilités ; * des _[NullPointerException](https://openjdk.java.net/jeps/358)_ plus explicites.