Après six mois de développement, Oracle a lancé la plateforme Java SE 18 (Java Platform, Standard Edition 18), 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 18 conserve la compatibilité ascendante avec les versions précédentes de la plateforme Java — la plupart des projets Java précédemment écrits fonctionneront sans modification sur la nouvelle version. Des versions prêtes à l'installation de Java SE 18 (JDK, JRE et Server JRE) ont été préparées pour Linux (x86_64, AArch64), Windows (x86_64) et macOS (x86_64, AArch64). La mise en œuvre de référence de Java 18, développée dans le cadre du projet OpenJDK, est entièrement open source sous la licence GPLv2 avec des exceptions GNU ClassPath, permettant le lien dynamique avec des produits commerciaux.
Java SE 18 est classé parmi les versions à cycle de support standard, avec des mises à jour publiées jusqu'à la prochaine version. La version à long terme de support (LTS) à utiliser est Java SE 17, pour laquelle des mises à jour seront disponibles jusqu'en 2029. À rappeler qu'à partir de la version Java 10, le projet a adopté un nouveau processus de développement, impliquant un cycle de création de nouvelles versions plus court. La nouvelle fonctionnalité est désormais développée dans une branche principale continuellement mise à jour, qui inclut les modifications prêtes et à partir de laquelle des branches pour stabiliser les nouvelles versions sont dérivées tous les six mois.
Parmi les nouveautés de Java 18, on peut noter :
- L'encodage UTF-8 est activé par défaut. Les API Java traitant des données textuelles en tenant compte de l'encodage des caractères utiliseront désormais par défaut UTF-8 sur toutes les plateformes, quelles que soient les configurations système et la locale définie. Pour revenir au comportement antérieur, dans lequel l'encodage était choisi en fonction de la locale système, le paramètre « -Dfile.encoding=COMPAT » peut être utilisé.
- Le package com.sun.net.httpserver est inclus, comprenant l'outil jwebserver et une API de bibliothèque qui met en œuvre un serveur http simple pour servir du contenu statique (les gestionnaires de type CGI et servlet ne sont pas pris en charge). Le serveur http intégré n'est pas optimisé pour les charges de travail et ne prend pas en charge la gestion des accès et l'authentification, car il est principalement destiné à un usage lors du développement pour créer des prototypes, déboguer et tester des projets.
- JavaDoc prend en charge la balise « @snippet » pour intégrer des exemples pratiques et des fragments de code dans la documentation de l'API, qui peuvent être utilisés avec des outils pour vérifier la validité, mettre en surbrillance la syntaxe et s'intégrer aux IDE.
- L'implémentation de l'API java.lang.reflect (Core Reflection) a été révisée pour obtenir des informations sur les méthodes, champs et constructeurs des classes, ainsi que pour accéder à la structure interne des classes. L'API elle-même est restée inchangée, mais est désormais implémentée via des descripteurs de méthodes (method handles) fournis par le module java.lang.invoke, au lieu d'utiliser des générateurs de bytecode. Ce changement a permis d'unifier les implémentations de java.lang.reflect et java.lang.invoke et de simplifier leur maintenance.
- Une troisième pré-implémentation de l'API Vector a été proposée, offrant des fonctions pour les calculs vectoriels exécutés à 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 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 interface SPI (service-provider interface) a été ajoutée pour la résolution des noms d'hôtes et adresses IP, permettant d'utiliser dans java.net.InetAddress des résolveurs alternatifs qui ne sont pas liés aux gestionnaires proposés par le système d'exploitation.
- La deuxième implémentation préliminaire de l'API Foreign Function & Memory a été proposée, permettant aux applications d'interagir avec du code et des données situés 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 à de la mémoire non gérée par la JVM. Par exemple, il est possible d'appeler des fonctions depuis des bibliothèques partagées externes et d'accéder aux données d'un processus sans utiliser JNI.
- Une deuxième implémentation expérimentale de la correspondance par motif dans les expressions « switch » a été ajoutée, permettant d'utiliser dans les balises « case » non pas des valeurs exactes, mais des motifs flexibles couvrant une série de valeurs pour lesquelles il était auparavant nécessaire d'utiliser de longues chaînes d'expressions « if…else ». 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 mécanisme de finalisation a été déclaré obsolète et sera désactivé dans l'une des prochaines versions, ainsi que les méthodes associées, comme Object.finalize(), Enum.finalize(), Runtime.runFinalization() et System.runFinalization().
- Les collecteurs de déchets ZGC (Z Garbage Collector), SerialGC et ParallelGC ont implémenté le support de la déduplication des chaînes.
Source : opennet.ru
