Java 20, ou Java Development Kit (JDK) 20, la prochaine version prévue du standard Java, a atteint le stade de version candidate, après avoir achevé les phases Rampdown. Les six fonctionnalités officiellement prévues pour cette déclinaison - Scoped Values, Record Patterns, Pattern Matching for switch, Foreign Function & Memory API, Virtual Threads, Structured Concurrency - sont soit au stade d'incubation, soit au stade d'aperçu. Selon un bulletin de Mark Reinhold, architecte en chef du groupe Java Platform d'Oracle, Java 20 est passé au stade de release candidate le 9 février. Une deuxième version candidate est prévue pour le 23 février. La version a atteint la première phase de Rampdown le 8 décembre et une phase ultérieure de Rampdown le 19 janvier, les développeurs cherchant à corriger les bogues et éventuellement à ajouter des améliorations tardives, avec des approbations requises. La disponibilité générale du JDK est prévue pour le 21 mars 2023, en conformité avec le calendrier de publication semestrielle d'Oracle pour les éditions standard de Java. Le JDK 20 succèdera au JDK 19 sorti le 20 septembre. Des versions à accès anticipé du JDK 20 sont disponibles sur jdk.java.net.
Voici les six principales fonctionnalités attendues dans JDK 20 :
- Scoped values : cette API en phase d'incubation permet de partager des données immuables au sein d'un même thread ou entre plusieurs threads. Ces valeurs sont préférables aux variables locales aux threads, en particulier quand on utilise un grand nombre de threads virtuels. Scope Value permet de partager des données de manière sûre et efficace entre les composants d'un grand programme sans recourir aux arguments de méthode. Les objectifs de l’API sont d’apporter de la facilité d'utilisation, de l’intelligibilité, de la robustesse et des performances.
- Record Patterns : 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 and memory API : en seconde preview également, cette API permet 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.
- Virtual threads : en seconde preview, les Virtual threads sont des threads légers qui demandent moins d'effort d'écriture, de maintenance et d'observation des applications concurrentes à haut débit. Depuis le premier aperçu livré avec le JDK 19, l'API a connu des changements mineurs (quelques modifications rendues dans l’API permanentes dans le JDK 19) et des dégradations de ThreadGroup (également rendues permanentes dans le JDK 19).
- Structured Concurrency : cette API vient simplifier 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 son incubation dans le JDK 19 est que StructuredTaskScope a été mis à jour pour prendre en charge l'héritage des Scoped Values par les threads créés dans la portée d'une tâche. Cette fonctionnalité est en cours de réincubation.
- Pattern matching for switch statements and expressions : en quatrième aperçu - elle était déjà présente dans les JDK 17, JDK 18 et JDK 19 - la fonctionnalité permet l'expression concise et sûre de requêtes complexes orientées données. Elle pourra évoluer en continu avec les Record Patterns, ce qui permettra des améliorations continues basées sur l'expérience et le feedback. Parmi les principales modifications apportées au Pattern matching for switch depuis le troisième aperçu, on peut citer une grammaire simplifiée pour les étiquettes de switch et la prise en charge de l'inférence des arguments de type pour les generic patterns et les record patterns dans les déclarations et expressions de switch. De plus, un switch exhaustif sur une classe enum provoque désormais une MatchException plutôt qu'une IncompatibleClassChangeError si aucune étiquette de switch ne s'applique au moment de l'exécution.
Parmi les fonctionnalités qui n'ont pas été intégrées au JDK 20, mais toujours à l'étude pour Java, on peut citer les génériques universels, les templates string, les collections séquencées et une API VM de suivi de pile asynchrone. Le JDK 20 est une version de support à court terme (Short Term Support, STS), c’est-à-dire qu’elle ne bénéficiera que de six mois de support de niveau Premier de la part d'Oracle. Le JDK 21, prévu pour septembre 2023, sera une version de support à long terme (Long Terme Support, LTS), et bénéficiera de plusieurs années de support.