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 pour l’inclusion des fils d’exécution — threads — locaux (aka Fibers). Les notes de version vous permettront d’avoir plus de détails.
Sommaire
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 et 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 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 ou là) 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 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
C’est une extension d’un module libéré par Oracle dans le JDK 10 (Application Class‑Data Sharing JEP 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 (heap) est passée de 4 à 16 Tio.
Divers
Intégration d’Unicode 12.1, vous pourrez désormais avoir un émoji gilet jaune. Pour les personnes plus versées dans les aspects sécurité, la lecture du blog de Sean Mullan 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. Il s’agit d’une des solutions pour rendre le code Java moins verbeux, et donc limiter le risque d’erreurs. Ainsi, le code :
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 :
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 :
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. 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 :
String html = "<html>\n" +
" <body>\n" +
" <p>Hello, world</p>\n" +
" </body>\n" +
"</html>\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 :
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
String query = """
SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
WHERE `CITY` = 'INDIANAPOLIS'
ORDER BY `EMP_ID`, `LAST_NAME`;
""";
Ce guide exhaustif en anglais à 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, qui seront une sorte de data class telle que présente dans d’autres langages ;
- les Sealed type, qui seront des types algébriques permettant de restreindre les possibilités ;
- des NullPointerException plus explicites.
Aller plus loin
- Notes de version (55 clics)
- AdoptOpenJDK (63 clics)
- Vidéo sur les dernières nouveautés et celles à venir (40 clics)
# distributions du jdk
Posté par c2462250 . Évalué à 2.
A quoi ça sert d'avoir différentes distributions du JDK, plutôt qu'une seule de référence?
[^] # Re: distributions du jdk
Posté par barmic 🦦 . Évalué à 7.
Aujourd'hui que je sache ces distributions ont uniquement des contrats de support différents (en prix en durée etc). C'est juste une façon de matérialiser ça.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: distributions du jdk
Posté par pulkomandy (site web personnel, Mastodon) . Évalué à 6.
C'est pour faire comme GNU/Linux!
[^] # Re: distributions du jdk
Posté par barmic 🦦 . Évalué à 4.
Le parallèle n'est pas déconnant. Je ne pense pas que les contributeurs du noyau linux veulent faire du support. Ils tiennent juste leur projet.
Avec le passage de l'upstream d'Oracle à OpenJDK, on a probablement la même organisation : les contributeurs OpenJDK sont « juste » des développeurs et ne veulent pas gérer du support. Ceux qui veulent faire du support font tout le taff de packaging etc. Debian continue de prendre OpenJDK parce qu'ils savent faire ce packaging (c'est ce qu'ils savent faire). Oracle/Amazon/whatever veulent proposer un Java sur leur plateforme et vont donc packager OpenJDK.
https://linuxfr.org/users/barmic/journaux/y-en-a-marre-de-ce-gros-troll
[^] # Re: distributions du jdk
Posté par Finway . Évalué à 4. Dernière modification le 25 septembre 2019 à 14:49.
des JVM's différentes
des tests différents
du support différent
… etc
cf. la doc commerciale d'Azul par exemple:
https://www.azul.com/products/zulu-enterprise/jdk-comparison-matrix/
# triple quotes litterals
Posté par Gil Cot ✔ (site web personnel, Mastodon) . Évalué à 0.
Les javaistes aiment bien taper sur les pythonistes mais pourtant copient de plus en plus de choses des inférieurs :o La dernière en date est la syntaxe heredoc (enfin) :)
“It is seldom that liberty of any kind is lost all at once.” ― David Hume
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.