Après avoir livré bien des détails en février dernier, Oracle a livré Java 20 en version de production. Cette mise à jour du kit de développement (JDK) comprend plusieurs innovations encore en test comme les threads virtuels et la concurrence structurée. Au total sept fonctionnalités sont en incubation allant des API vectorielles, des valeurs délimitées, des patterns pour les enregistrements, les déclarations de changements des instructions et des expressions, ainsi que d’une fonction foreign et une API mémoire. Sorti avec un support à court terme pendant 6 mois, le JDK 20 fait suite à la version du JDK 19 déployée le 20 septembre dernier. Le JDK 21, prévu pour septembre, sera une version de support à long terme (LTS). Java 20 peut être téléchargé sur le site web d'Oracle.

API vectorielle et threads virtuels an rendez-vous

Au final, voici les fonctionnalités à ne pas manquer dans Java 20. En premier lieu, les API vectorielles ont été officiellement ajoutées il y a quelques semaines. Elles expriment les calculs qui se compilent de manière fiable au moment de l'exécution en tant qu'instructions de ce type sur les architectures CPU. Les performances seraient ainsi supérieures à celles des calculs scalaires équivalents. L'API vectorielle a été incubée dans les JDK 16, JDK 17, JDK 18 et JDK 19.

Autre élément, les threads virtuels qui bénéficient d’une seconde preview. Il s’agit de thread légers qui réduisent l’effort d’écriture, des maintenance et d’observation des applications concurrentes. Selon Oracle, cette capacité changera fondamentalement la façon dont les applications Java sont mises à l'échelle. Les modifications mineures apportées depuis le premier aperçu dans le JDK 19 comprennent un petit nombre de modifications de l'API (rendues permanentes dans le JDK 19) et des dégradations de ThreadGroup (également rendues permanentes dans le JDK 19).

Structured concurrency et record patterns aussi disponibles

De son côté, structured concurrency se matérialise en une API qui simplifie la programmation multithread et traite plusieurs tâches exécutées dans différents threads comme une seule unité de travail. La gestion et l'annulation des erreurs sont rationalisées, ce qui améliore la fiabilité et l'observabilité. Le seul changement depuis l'incubation dans le JDK 19 est que StructuredTaskScope a été mis à jour pour prendre en charge des anciennes valeurs référencées par les threads. Pour mémoire, les scoped values, une API en phase d'incubation, permettent le partage de données immuables au sein et entre les threads. Elles sont préférables aux variables locales, en particulier lors de l'utilisation d'un grand nombre de threads virtuels. Les scoped values sont capables de partager des données de manière sûre et efficace entre les composants d'un grand programme sans avoir recours à des arguments de méthode.

Disponibles en seconde preview, les record patterns améliorent le langage de programmation Java avec des motifs pour déconstruire les valeurs d'enregistrement Record Values. Les motifs d'enregistrement (record patterns) et les motifs de type (type patterns) peuvent être imbriqués pour permettre une forme déclarative, puissante et composable de navigation et de traitement des données. Les objectifs sont d'étendre le filtrage de motifs pour exprimer des requêtes de données plus sophistiquées et composables, sans modifier la syntaxe ou la sémantique des motifs de type. Parmi les principales modifications apportées depuis le premier aperçu livré avec le JDK 19, on peut citer le support de l’inférence du type paramétré pour les patterns de record generic, le support des record patterns dans les boucles for (enhanced for statements) et la suppression du support des patterns de record nommés.

Foreign function et memory API améliorées

Enfin, foreign function et memory API proposent aux programmes Java d’interagir avec du code et des données en dehors du runtime Java, notamment aux applications Java d'appeler des bibliothèques natives et de traiter des données natives sans la fragilité et les risques de la JNI (Java Native Interface). L'API a été précédemment incubée dans les versions 17 et 18 du JDK et présentée en avant-première dans le JDK 19. Parmi les améliorations apportées depuis le JDK 19, on peut citer l'unification des abstractions MemorySegment et MemoryAddress, une hiérarchie MemoryLayout améliorée et la division de MemorySession en Arena et SegmentScope pour promouvoir le partage des segments au-delà des limites de maintenance.

Les fonctionnalités du JDK 20 sont en passe d'être normalisées, selon Oracle. Ces fonctionnalités sont issues de projets de recherche Java, notamment Amber, pour les fonctionnalités axées sur la productivité (modèles d'enregistrement et correspondance de modèles pour les commutateurs) ; Panama, pour l'interconnexion de la JVM avec le code natif (fonction étrangère et API de mémoire et API de vecteur) ; et Loom, qui incube les nouvelles fonctionnalités de la JVM et les API construites au-dessus d'elles (valeurs cadrées, threads virtuels, et concurrence structurée).

Les capacités qui n'ont pas été intégrées au JDK 20 mais qui sont toujours à l'étude pour Java comprennent les génériques universels, les modèles de chaînes, les collections séquencées et une API VM asynchrone de suivi de pile.