Ce Java 16 (Oracle JDK 16) intègre une vingtaine de nouveautés pour améliorer davantage la productivité des développeurs.
La dernière version du Java Development Kit intègre la finalisation du filtrage par motif (Pattern Matching) pour l’opérateur instanceof (JEP 394) et les enregistrements (JEP 395), ainsi que des améliorations du langage présentées en préversion dans Java 14. Les développeurs pourront également utiliser le nouvel outil de packaging (JEP 392) pour livrer des applications Java auto-contenues, mais aussi découvrir trois interfaces de programmation en incubation : API Vecteur (JEP 338), API d’édition de liens étrangers (JEP 389) et API d’accès à la mémoire étrangère (JEP 389), ainsi qu’une fonctionnalité en préversion : les Classes scellées (JEP 397).
Alrs qu’Oracle publie tous les six mois des mises à jour de Java afin que les développeurs puissent s’appuyer sur un calendrier prévisible des sorties, Georges Saab, Vice President of Development, Java Platform Group chez Oracle explique : “Cette dernière version démontre toute la puissance de ce rythme semestriel. Le filtrage par motif et les enregistrements étaient apparus pour la première fois il y a un an avec le JDK 14. Ils ont depuis intégré plusieurs cycles de commentaires de la communauté basés sur leur utilisation dans des applications opérationnelles. Ce processus a permis aux développeurs Java d’expérimenter ces fonctionnalités avant leur finalisation, mais il a aussi permis de tenir compte de ces retours essentiels pour aboutir à deux JEP solides comme le roc qui répondent vraiment aux besoins de la communauté.”
Voici les nouveautés détaillées par l’éditeur :
Améliorations du langage présentées dans JDK 14 et finalisées dans JDK 16
· JEP 394 : Filtrage par motif (Pattern Matching) pour instanceof – Enrichit le langage de programmation Java avec le filtrage par motif pour l’instance de l’opérateur.
· JEP 395 : Enregistrements – Enrichit le langage de programmation Java avec des enregistrements (Records), à savoir des classes agissant comme des transporteurs transparents de données non modifiables. Les enregistrements peuvent être vus comme des tuples nominaux.
Nouvel outil pour améliorer la productivité des développeurs
· JEP 392 : Outil de packaging – Fournit l’outil jpackage pour packager des applications Java auto-contenues.
Améliorations de la gestion de la mémoire
· JEP 387 : Méta-espace élastique – Restitue plus rapidement au système d’exploitation la mémoire classe-métadonnées HotSpot inutilisée (c’est-à-dire le méta-espace, ou metaspace), diminue l’empreinte du méta-espace et simplifie le code du méta-espace pour réduire les coûts de maintenance.
· JEP 376 : ZGC : Traitement simultané de la pile de threads – Déplace le traitement de la pile de threads de ZGC des points de sécurité (safepoints) vers une phase concurrente. Ce travail supprime le dernier goulet d’étranglement significatif pour le traitement concurrent des piles.
Amélioration du réseau
· JEP 380 : Canaux des sockets de domaine UNIX – Ajoute le support de toutes les fonctionnalités des sockets de domaine Unix (communes à Windows et aux plus grands plateformes Unix) aux API de canaux de socket et de canaux de socket serveur dans le package java.nio.channels. Les sockets de domaine Unix sont utilisées pour les communications inter-processus (IPC) sur le même hôte. Elles sont en de nombreux points comparables aux sockets TCP/IP, sauf qu’elles sont adressées par des noms de chemin du système de fichiers plutôt que par des adresses et des numéros de port Internet Protocol (IP).
Traitement du code incompatible avec les évolutions futures
· JEP 396 : Encapsulage fort des internes du JDK par défaut – Dans le JDK 9 nous avions encapsulé fortement les nouveaux éléments de l’API interne, afin d’en limiter l’accès. Cependant, pour faciliter la migration, JDK 9 avait délibérément choisi de ne pas encapsuler fortement à l’exécution le contenu des packages qui existaient dans JDK 8. JDK 16 restreint cette contrainte en encapsulant par défaut la plupart des éléments internes du JDK, sauf pour des API internes critiques telles que sun.misc.Unsafe. Les utilisateurs finaux peuvent toujours choisir l’encapsulation forte plus légère qui était le comportement par défaut depuis JDK 9. Cette solution encourage les développeurs à migrer de l’utilisation d’éléments internes à l’utilisation des API standards, afin qu’eux-mêmes et leurs utilisateurs puissent passer sans problème aux futures versions de Java.
· JEP 390 : Avertissements pour les classes basées sur des valeurs – Désigne les classes enveloppantes primitives comme étant basées sur des valeurs et déprécie leurs constructeurs pour encourager leur suppression, en générant de nouveaux avertissements de dépréciation. Génère des avertissements de tentatives inappropriées de synchronisation sur des instances de toute classe basée sur des valeurs dans la plateforme Java.
Fonctionnalités en statut d’incubation et de préversion (preview)
· JEP 338 : API Vecteur (incubation) – Fournit une itération initiale d’un module en incubation, jdk.incubator.vector, pour exprimer des calculs de vecteurs se compilant de façon fiable à l’exécution vers des instructions matérielles optimales de vecteurs sur les architectures CPU supportées.
· JEP 389 : API d’édition de liens étrangers (incubation) – Introduit Foreign Linker API, une API offrant un accès au code natif pur-Java typé statiquement.
· JEP 393 : API d’accès à la mémoire étrangère (troisième incubation) – Introduit une API permettant aux programmes Java d’accéder de façon sure et efficace à la mémoire étrangère à l’extérieur du heap Java.
· JEP 397 : Classes scellées (deuxième préversion) – Enrichit le langage de programmation Java avec des classes et interfaces scellées. Les classes et interfaces scellées restreignent les autres classes ou interfaces qui pourront les étendre ou les implémenter.
Améliorations pour les contributeurs d’OpenJDK
· JEP 347 : Autorise les fonctionnalités du langage C++14 (dans le code source du JDK) – Permet l’utilisation des fonctionnalités du langage C++14 dans le code source C++ du JDK, et formule des recommandations précises sur les fonctionnalités qui peuvent être utilisées dans le code HotSpot.
· JEP 357 : Migration de Mercurial vers Git – Migre les référentiels de codes sources de la communauté OpenJDK depuis Mercurial (hg) vers Git.
· JEP 369 : Migration vers GitHub – Héberge les référentiels Git de la communauté OpenJDK sur GitHub.
De nouveaux portages pour le support de Java sur encore plus de plateformes
· JEP 386 : Portage Alpine Linux – Porte le JDK sur Alpine Linux, et sur d’autres distributions Linux utilisant musl comme bibliothèque C primaire, sur les deux architectures x64 et AArch64.
· JEP 388 : Portage Windows/Aarch64 – Porte le JDK sur Windows/AArch64.