AprĂšs six mois de dĂ©veloppement, Oracle a lancĂ© la plateforme Java SE 17 (Java Platform, Standard Edition 17), dont l'implĂ©mentation de rĂ©fĂ©rence est le projet open-source OpenJDK. Ă l'exception de la suppression de certaines fonctionnalitĂ©s obsolĂštes, Java SE 17 maintient la rĂ©trocompatibilitĂ© avec les versions antĂ©rieures de la plateforme Java â la plupart des projets Java Ă©crits prĂ©cĂ©demment fonctionneront sans modifications avec la nouvelle version. Des builds prĂȘtes Ă installer de Java SE 17 (JDK, JRE et Server JRE) sont disponibles pour Linux (x86_64, AArch64), Windows (x86_64) et macOS (x86_64, AArch64). L'implĂ©mentation de rĂ©fĂ©rence de Java 17 dĂ©veloppĂ©e dans le cadre du projet OpenJDK est entiĂšrement ouverte sous la licence GPLv2 avec des exceptions GNU ClassPath, permettant le lien dynamique avec des produits commerciaux.
Java SE 17 est classĂ© parmi les versions Ă long terme de support (LTS), avec des mises Ă jour qui seront publiĂ©es jusqu'en 2029. La publication des mises Ă jour pour la version intermĂ©diaire prĂ©cĂ©dente, Java 16, a Ă©tĂ© interrompue. L'ancienne branche LTS, Java 11, sera supportĂ©e jusqu'en 2026. La prochaine version LTS est prĂ©vue pour septembre 2024. Rappelons qu'Ă partir de la version Java 10, le projet a adoptĂ© un nouveau processus de dĂ©veloppement, avec un cycle de publication de nouvelles versions plus court. Les nouvelles fonctionnalitĂ©s sont dĂ©sormais dĂ©veloppĂ©es dans une branche master en constante mise Ă jour, qui intĂšgre les modifications prĂȘtes et Ă partir de laquelle des branches pour la stabilisation de nouvelles versions sont créée tous les six mois.
Parmi les nouveautés de Java 17, on peut noter :
- Une implĂ©mentation expĂ©rimentale de l'appariement de modĂšles dans les expressions «switch» a Ă©tĂ© proposĂ©e, permettant l'utilisation de modĂšles flexibles dans les Ă©tiquettes «case» au lieu de valeurs prĂ©cises, englobant immĂ©diatement une sĂ©rie de valeurs, ce qui nĂ©cessitait auparavant des chaĂźnes d'expressions «ifâŠelse» encombrantes. De plus, des capacitĂ©s de traitement des valeurs NULL ont Ă©tĂ© ajoutĂ©es Ă l'intĂ©rieur de «switch». Object o = 123L; String formatted = switch (o) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); case String s -> String.format("String %s", s); default -> o.toString(); };
- Le support des classes et interfaces scellĂ©es a Ă©tĂ© stabilisĂ©, qui ne peuvent pas ĂȘtre utilisĂ©es par d'autres classes et interfaces pour l'hĂ©ritage, l'extension ou la redĂ©finition de l'implĂ©mentation. Les classes scellĂ©es fournissent Ă©galement une maniĂšre plus dĂ©clarative de restreindre l'utilisation du super-classe, par rapport aux modificateurs d'accĂšs, qui reposent sur l'Ă©numĂ©ration explicite des sous-classes autorisĂ©es Ă ĂȘtre Ă©tendues. package com.example.geometry; public sealed class Shape permits com.example.polar.Circle, com.example.quad.Rectangle, com.example.quad.simple.Square {âŠ}
- Une deuxiĂšme mise en Ćuvre prĂ©liminaire de l'API Vector a Ă©tĂ© proposĂ©e, fournissant des fonctions pour les calculs vectoriels qui s'exĂ©cutent en utilisant des instructions vectorielles des processeurs x86_64 et AArch64 et permettant d'appliquer simultanĂ©ment des opĂ©rations Ă plusieurs valeurs (SIMD). Contrairement aux capacitĂ©s d'auto-vectorisation des opĂ©rations scalaires fournies par le compilateur JIT HotSpot, la nouvelle API permet de gĂ©rer explicitement la vectorisation pour le traitement parallĂšle des donnĂ©es.
- Une mise en Ćuvre prĂ©liminaire de l'API Foreign Function & Memory a Ă©tĂ© ajoutĂ©e, permettant aux applications d'interagir avec le code et les donnĂ©es qui se trouvent en dehors de l'environnement d'exĂ©cution Java. La nouvelle API permet d'appeler efficacement des fonctions exĂ©cutĂ©es en dehors de la JVM et d'accĂ©der Ă la mĂ©moire non gĂ©rĂ©e par la JVM. Par exemple, il est possible d'appeler des fonctions Ă partir de bibliothĂšques partagĂ©es externes et d'accĂ©der aux donnĂ©es d'un processus sans utiliser JNI.
- Le moteur de rendu pour macOS, qui prend en charge l'API Java 2D, qui à son tour est utilisée dans l'API Swing, a été adapté pour utiliser l'API graphique Metal. Par défaut, OpenGL est toujours utilisé sur la plateforme macOS, et pour activer le support de Metal, vous devez définir le paramÚtre « -Dsun.java2d.metal=true » et disposer d'au moins macOS 10.14.x.
- Un port pour la plateforme macOS/AArch64 (ordinateurs Apple basĂ©s sur les nouvelles puces Apple M1) a Ă©tĂ© ajoutĂ©. La caractĂ©ristique du port est le support du mĂ©canisme de protection de la mĂ©moire W^X (Write XOR Execute), oĂč les pages de mĂ©moire ne peuvent pas ĂȘtre accessibles simultanĂ©ment en Ă©criture et en exĂ©cution. (Le code ne peut ĂȘtre exĂ©cutĂ© qu'aprĂšs l'interdiction de l'Ă©criture, et une Ă©criture dans une page de mĂ©moire n'est possible qu'aprĂšs l'interdiction de l'exĂ©cution).
- L'utilisation d'une sémantique strictement stricte (strictfp) pour les expressions à virgule flottante a été rétablie. Le support de la sémantique 'default', introduite avec Java 1.2, qui simplifiait le fonctionnement sur des systÚmes avec de trÚs anciens coprocesseurs mathématiques x87 (avec l'arrivée des instructions SSE2, la nécessité d'une sémantique supplémentaire a disparu), a été abandonné.
- De nouveaux types d'interfaces pour les générateurs de nombres pseudo-aléatoires ont été implémentés, ainsi que des algorithmes supplémentaires pour une génération de nombres aléatoires de meilleure qualité. Les applications ont désormais la possibilité de choisir l'algorithme de génération des nombres pseudo-aléatoires. Le support pour la génération de flux d'objets aléatoires a été amélioré.
- L'encapsulation stricte de tous les Ă©lĂ©ments internes du JDK est devenue obligatoire, Ă l'exception des API critiques, telles que sun.misc.Unsafe. L'encapsulation stricte empĂȘche les tentatives d'accĂšs depuis le code aux classes internes, mĂ©thodes et champs. Auparavant, le mode d'encapsulation stricte pouvait ĂȘtre dĂ©sactivĂ© avec l'option 'âillegal-access=permit', mais cette option a maintenant Ă©tĂ© dĂ©clarĂ©e obsolĂšte. Les applications nĂ©cessitant un accĂšs aux classes, mĂ©thodes et champs internes doivent les dĂ©finir explicitement Ă l'aide de l'option 'âadd-opens' ou de l'attribut Add-Opens dans le fichier manifeste.
- Les applications peuvent dĂ©sormais dĂ©finir des filtres pour dĂ©sĂ©rialiser des donnĂ©es, qui peuvent dĂ©pendre du contexte et ĂȘtre sĂ©lectionnĂ©es dynamiquement lier Ă des opĂ©rations spĂ©cifiques de dĂ©sĂ©rialisation. Les filtres ainsi dĂ©finis sont applicables Ă l'ensemble de la une machine virtuelle JVM, c'est-Ă -dire qu'ils couvrent non seulement l'application elle-mĂȘme, mais aussi les bibliothĂšques tierces utilisĂ©es dans l'application.
- Un nouveau méthode javax.swing.filechooser.FileSystemView.getSystemIcon a été ajouté à Swing pour charger des icÎnes de grande taille, permettant d'améliorer l'interface utilisateur sur les écrans à haute densité de pixels (HighDPI).
- L'API java.net.DatagramSocket a été améliorée pour supporter la connexion à des groupes Multicast sans avoir besoin d'utiliser l'API distincte java.net.MulticastSocket.
- L'utilitaire IGV (Ideal Graph Visualizer) a été perfectionné, offrant une visualisation interactive de la représentation intermédiaire du code dans le compilateur JIT HotSpot VM C2.
- Dans JavaDoc, de maniÚre similaire au compilateur javac, le numéro de la ligne problématique dans le fichier source ainsi que l'emplacement de l'erreur sont désormais indiqués lors de l'affichage d'une erreur.
- Ajout de la propriété native.encoding, reflétant le nom de l'encodage de caractÚres systÚme (UTF-8, koi8-r, cp1251, etc.).
- Ajout de l'interface java.time.InstantSource, permettant de manipuler le temps sans lien avec un fuseau horaire.
- Ajout de l'API java.util.HexFormat pour convertir en représentation hexadécimale et vice versa.
- Le compilateur a ajoutĂ© le mode blackhole, dĂ©sactivant les opĂ©rations d'exception de code inutilisĂ© (elimination de code mort), ce qui peut ĂȘtre utilisĂ© pour des tests de performance.
- Une option « -Xlog:async » a été ajoutée au Runtime pour enregistrer les journaux en mode asynchrone.
- Pour les connexions sécurisées, TLS 1.3 est utilisé par défaut (auparavant, TLS 1.2 était utilisé).
- L'API Applet (java.applet.Applet*, javax.swing.JApplet), anciennement utilisĂ©e pour lancer des applications Java dans le navigateur, a Ă©tĂ© classĂ©e parmi celles prĂ©vues pour suppression (elle est devenue obsolĂšte aprĂšs l'arrĂȘt du support du plugin Java pour les navigateurs).
- Le Security Manager, qui est devenu obsolĂšte et a Ă©tĂ© abandonnĂ© aprĂšs l'arrĂȘt du support du plugin de navigateur, a Ă©tĂ© classĂ© parmi ceux prĂ©vus pour suppression.
- Le mécanisme RMI Activation, obsolÚte depuis Java 8 et presque jamais utilisé dans les pratiques modernes, a été supprimé.
- Le compilateur expĂ©rimental prenant en charge JIT (just-in-time) pour la compilation dynamique du code Java pour HotSpot JVM, ainsi que le mode de compilation anticipĂ©e (AOT, ahead-of-time) des classes en code machine avant le dĂ©marrage de la machine virtuelle, a Ă©tĂ© supprimĂ© du SDK. Le compilateur, Ă©crit en Java, Ă©tait basĂ© sur les travaux du projet Graal. Il est Ă noter que l'entretien de ce compilateur demande des efforts importants qui ne se justifient pas dans un contexte de dĂ©sintĂ©rĂȘt des dĂ©veloppeurs.
Source : opennet.ru
