Après six mois de développement, Oracle a publié la plateforme Java SE 23 (Java Platform, Standard Edition 23), dont la mise en œuvre de référence est basée sur le projet open source OpenJDK. À l'exception de la suppression de certaines fonctionnalités obsolètes, Java SE 23 maintient la compatibilité avec les versions antérieures de la plateforme Java : la plupart des projets Java précédemment écrits fonctionneront sans modification avec la nouvelle version. Des distributions prêtes à l'installation de Java SE 22 (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 23 développée dans le cadre du projet OpenJDK est complètement ouverte sous la licence GPLv2, avec des exceptions GNU ClassPath, permettant le liage dynamique avec des produits commerciaux.
Java SE 23 est classé parmi les versions à support standard, des mises à jour étant publiées jusqu'à la prochaine version. Pour une branche à support prolongé (LTS), il convient d'utiliser Java SE 21 ou Java SE 17, des mises à jour étant prévues jusqu'en 2031 et 2029 respectivement (publiques jusqu'en 2028 et 2026). Le support prolongé pour la branche LTS de Java SE 8 se poursuivra jusqu'en 2030, et pour Java SE 11 jusqu'en 2032.
Parmi les nouveautés proposées dans Java SE 23 :
- Le mode génératif du ramasse-miettes ZGC (Generational Z Garbage Collector) est activé par défaut, utilisant le traitement séparé des objets « vieux » et « jeunes », ce qui améliore l'efficacité de la collecte des objets récemment créés ayant une courte durée de vie. L'utilisation de Generational ZGC réduit les risques de pauses lors de l'allocation des ressources, diminue la charge CPU et la consommation de mémoire lors de la collecte des ordures. Des tests de Generational ZGC avec Apache Cassandra 4 ont montré une augmentation de 4 fois le débit avec une taille de tas (heap) fixe et une réduction de la taille du tas d'un quart tout en maintenant le même débit.
- Le support de la balise Markdown pour la documentation du code dans les commentaires a été ajouté à JavaDoc, pouvant être utilisé à la place d'un mélange de HTML et de @-tags JavaDoc.

- Les mécanismes de correspondance par échantillonnage ont été étendus avec le support préalable de l'utilisation de types primitifs (int, byte, char et autres types de base non objets) dans tous les types de modèles, dans l'opérateur « instanceof » et dans les blocs « switch ». switch (x.getStatus()) { case 0 -> « okay »; case 1 -> « warning »; case 2 -> « error »; case int i -> « unknown status: » + i; } if (i instanceof byte b) { … b … }
- Un support préalable a été ajouté pour utiliser une seule expression « import module M » pour importer tous les packages exportés par le module spécifié. Ce changement simplifie considérablement la réutilisation des bibliothèques modulaires, permettant de connecter des bibliothèques et des classes sans définir leur emplacement dans la hiérarchie des packages. Par exemple, spécifier « import module java.base » entraînera l'importation de tous les 54 packages appartenant au module java.base, qui auraient précédemment dû être mentionnés individuellement (« import java.io.* », « import java.util.* », etc.).
Une deuxième mise en œuvre préliminaire de l'API Class-File a été proposée pour analyser, générer et transformer des fichiers de classes Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith(« debug »))) { classBuilder.with(ce); } } });
- Une huitième mise en œuvre préliminaire de l'API Vector a été proposée, fournissant des fonctions pour les calculs vectoriels qui sont exécutées à l'aide des instructions vectorielles des processeurs x86_64 et AArch64, permettant d'appliquer simultanément des opérations à plusieurs valeurs (SIMD). Contrairement aux capacités fournies par le compilateur JIT HotSpot pour l'auto-vectorisation des opérations scalaires, la nouvelle API permet de gérer explicitement la vectorisation pour le traitement parallèle des données.
- La classe java.io.Console a été enrichie des méthodes format, printf, readPassword et readLine pour le formatage, l'affichage et la lecture de texte en tenant compte de la locale sélectionnée. System.console().printf(Locale.FRANCE, « %1$tY-%1$tB-%1$te %1$tA », new Date()) 2024-mai-16 jeudi
- Une deuxième implémentation préliminaire de l'API Stream étendu a été ajoutée, prenant en charge la définition d'opérations intermédiaires personnalisées, qui peuvent être utiles lorsque les opérations intermédiaires intégrées existantes ne sont pas suffisantes pour la transformation de données souhaitée. Les gestionnaires personnalisés sont connectés par le biais d'une nouvelle opération intermédiaire Stream::gather(Gatherer), qui traite les éléments du flux en appliquant le gestionnaire spécifié par l'utilisateur. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 == [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- Une troisième implémentation préliminaire de classes implicitement déclarées et d'instances anonymes de la méthode « main » a été ajoutée, dans laquelle il est possible de se passer des déclarations public/static, de la transmission d'un tableau d'arguments et d'autres entités liées à la déclaration de classe. // était public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // maintenant on peut void main() { System.out.println("Hello, World!"); }
- Une deuxième version préliminaire d'une fonctionnalité permettant de spécifier dans les constructeurs des expressions avant l'appel de super(...), utilisée pour appeler explicitement le constructeur de la classe parente à partir du constructeur de la classe dérivée, si ces expressions ne font pas référence à l'instance créée par le constructeur. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- Une troisième implémentation préliminaire des valeurs limitées (Scoped Values) a été ajoutée, permettant de partager des données immuables entre des flux et d'échanger efficacement des données entre des sous-flux (les valeurs sont héritées). Les Scoped Values sont développées pour remplacer le mécanisme des variables locales au flux (thread-local variables) et sont plus efficaces lors de l'utilisation d'un très grand nombre de flux virtuels (des milliers et des millions de flux). La principale différence des Scoped Values par rapport aux variables locales au flux est que les premières sont écrites une fois, ne peuvent pas être modifiées par la suite et restent accessibles uniquement pendant l'exécution du flux.
- Proposé pour test, la troisième version préliminaire de l'API pour la concurrence structurée (Structured Concurrency) simplifie le développement d'applications multi-threadées en traitant plusieurs tâches exécutées dans différents threads comme un seul bloc.
- Les méthodes d'accès à la mémoire externe (hors JVM) fournies par la classe sun.misc.Unsafe ont été déclarées obsolètes et sont prévues pour être supprimées. Pour accéder à la mémoire hors tas (off-heap) et interagir avec le code externe, il est recommandé d'utiliser les API VarHandle et FFM (Foreign Function & Memory).
On peut également noter la publication de la mise à jour de la plateforme pour la création d'applications avec l'interface graphique JavaFX 23 et l'inclusion du compilateur JIT GraalVM dans la distribution principale d'Oracle JDK 23.
Une nouvelle version de la machine virtuelle universelle GraalVM a également été présentée, prenant en charge l'exécution d'applications en JavaScript (Node.js), Python, Ruby, R, tous les langages pour la JVM (Java, Scala, Clojure, Kotlin) et les langages pour lesquels un code binaire LLVM peut être généré (C, C++, Rust). En plus du support de JDK 23, cette nouvelle version a optimisé la consommation de mémoire et la taille du code exécutable, et a mis en œuvre un support complet pour l'intégration de Python et WebAssembly dans le code Java en utilisant la compilation JIT.
Source : opennet.ru

