Sewatech - articles

Sortie du JDK 17

(Article publié le 3 novembre 2021)

Maintenant que la sortie d’une nouvelle version du JDK est devenu une routine, l’événement est l’arrivée d’une version LTS.

Voyons ce que cette version 17 nous apporte au niveau du langage, du runtime et des API.

Cycle de release

Le nouveau cycle de release commence à être rodé. On a eu cinq versions STS[1] (12 à 16), avec leurs nouveautés, leurs fonctionnalités en preview et leurs API expérimentales. Ce JDK 17 consolide ces 3 ans de travail dans une version LTS[2].

La prochaine version LTS devait être pour le JDK 23 dans 3 ans, mais le délai sera probablement réduit puisqu’on s’oriente vers une version LTS tous les 2 ans.

Par ailleur, Oracle a annonce le retour de la gratuité de son JDK, sous certaines conditions assez peu contraignantes. Je ne suis pas sûr que ça m’incite à abandonner OpenJDK pour autant.

Pour rappel, voici une liste de distributions d’OpenJDK :

Fonctionnalités

Les nouveautés du langage Java sont bien plus allèchantes que celles du JDK 11. Il y a des choses qui peuvent réellement changer notre code, comme les records, le pattern matching ou les classes scellées.

Les records ressemblent à des java beans simplifiés et modernisés. Plus précisément, ils permettent de définir des tuples nommés.

record Person(String name, int age) {}

Le pattern matching concerne pour l’instant l’instruction instanceof. Sa syntaxe a un peu évolué pour éviter des cast.

if (shape instanceof Rectangle rect) {
    return 2 * (rect.length() + rect.width());
} else if (shape instanceof Circle circle) {
    return 2 * PI * circle.radius();
} else {
    throw new IllegalArgumentException("Unrecognized shape");
}

Le pattern matching concerne aussi l’instruction switch. Ce projet est bien plus ambitieux. Dans un premier temps, la structure du switch a été enrichie pour en faire une expression, avec un recyclage de la flèche . Le pattern matching à proprement parler n’est qu’en preview.

return switch (shape) {

  case Rectangle rect -> 2 * rect.length() + 2 * rect.width();

  case Circle circle -> 2 * circle.radius() * Math.PI;

  default ->
    throw new IllegalArgumentException("Unrecognized shape");

};

Au niveau du runtime, les ramasse-miettes de nouvellle génération, ZGC et Shenendoah GC, sont sortis de la phase expérimentale. Leurs performances ont l’air vraiment impressionnantes. Et CMS, l’antique ramasse-miettes concurrent, a été retiré. G1 reste le garbage collector par défaut.

Au niveau des API en revanche, il y a beaucoup de petites choses, mais rien de bouleversant.

Conclusion

C’est dommage que le pattern matching ne soit pas terminé. Sinon, cette version LTS aurait pu être considérée comme réellement importante, au même niveau que les versions 5 (generics) et 8 (lambda).

A ce titre, la réduction du délai à 2 ans pour la prochaine version LTS est une bonne nouvelle, au moins à court terme. La version 21 marquera une nouvelle étape importante dans la modernisation du JDK. Rendez-vous en septembre 2023…​

N’hésitez pas à nous contacter si vous souhaitez planifier une formation sur les nouveautés du JDK 17.


1. Short Term Support
2. Long Term Support