Après six mois de développement, Oracle a publié la plateforme Java SE 23 (Java Platform, Standard Edition 23), qui utilise le projet open source OpenJDK comme implémentation de référence. À l'exception de la suppression de certaines fonctionnalités obsolètes, Java SE 23 maintient une compatibilité ascendante avec les versions précédentes de la plate-forme Java : la plupart des projets Java précédemment écrits fonctionneront sans modification lorsqu'ils seront exécutés sous la nouvelle version. Des versions prêtes à l'installation de Java SE 22 (JDK, JRE et Server JRE) sont préparées pour Linux (x86_64, AArch64), Windows (x86_64) et macOS (x86_64, AArch64). Développée par le projet OpenJDK, l'implémentation de référence Java 23 est entièrement open source sous licence GPLv2, avec des exceptions GNU ClassPath permettant une liaison dynamique avec des produits commerciaux.
Java SE 23 est classé comme une version de support standard et continuera à recevoir des mises à jour jusqu'à la prochaine version. La branche Long Term Support (LTS) devrait être Java SE 21 ou Java SE 17, qui recevront des mises à jour respectivement jusqu'en 2031 et 2029 (généralement disponibles jusqu'en 2028 et 2026). La prise en charge étendue de la branche LTS de Java SE 8 durera jusqu'en 2030 et de Java SE 11 jusqu'en 2032.
Parmi les 23 innovations proposées dans Java SE :
- Le mode de fonctionnement génératif du garbage collector ZGC (Generation Z Garbage Collector) est activé par défaut, en utilisant un traitement séparé des objets « anciens » et « jeunes », ce qui augmente l'efficacité du nettoyage des objets récemment créés avec une courte durée de vie. L'utilisation de Generational ZGC réduit le risque de blocage lors de l'allocation des ressources, réduit la charge du processeur et la consommation de mémoire lors du garbage collection. Les tests de Generational ZGC avec Apache Cassandra 4 ont montré une multiplication par 4 du débit avec une taille de tas fixe et une réduction d'un quart de la taille du tas avec un débit constant.
- JavaDoc a ajouté la prise en charge de l'utilisation de Markdown pour documenter le code dans les commentaires, qui peuvent être utilisés à la place d'un mélange de balises HTML et JavaDoc @.

- Les mécanismes de correspondance de modèles ont été améliorés avec une prise en charge préliminaire de l'utilisation de types primitifs (int, byte, char et autres types de base non-objet) dans toutes sortes de modèles, dans l'instruction "instanceof" et dans les blocs "switch". switch (x.getStatus()) { case 0 -> « ok » ; cas 1 -> « avertissement » ; cas 2 -> « erreur » ; case int i -> « statut inconnu : » + i ; } if (i instanceof byte b) { … b … }
- Ajout d'un support préliminaire pour l'utilisation d'une seule instruction "import module M" pour importer simultanément tous les packages exportés par un module spécifié. Le changement simplifie considérablement la réutilisation des bibliothèques modulaires, vous permettant d'inclure des bibliothèques et des classes sans déterminer leur place dans la hiérarchie des packages. Par exemple, spécifier « import module java.base » importera les 54 packages inclus dans le module java.base, qui auraient dû auparavant être mentionnés séparément (« import java.io.* », « import java.util.* " etc.).
Une deuxième implémentation préliminaire de l'API Class-File est proposée pour analyser, générer et convertir des fichiers de classe Java. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(octets); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue(). startWith("debug"))) { classBuilder.with(ce);
- Le huitième aperçu de l'API Vector fournit des fonctions pour les calculs vectoriels exécutés à l'aide d'instructions vectorielles sur les processeurs x86_64 et AArch64 et permettent d'appliquer simultanément des opérations à plusieurs valeurs (SIMD). Contrairement aux fonctionnalités fournies par le compilateur HotSpot JIT pour la vectorisation automatique des opérations scalaires, la nouvelle API permet de contrôler explicitement la vectorisation pour le traitement parallèle des données.
- Ajout des méthodes format, printf, readPassword et readLine à la classe java.io.Console pour formater, afficher et lire le texte en fonction des paramètres régionaux sélectionnés. 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 étendue a été ajoutée. Elle prend en charge la définition de vos propres opérations intermédiaires, ce qui peut être utile dans les cas où les opérations intermédiaires intégrées existantes ne suffisent pas pour la transformation de données souhaitée. Les gestionnaires natifs sont connectés à l'aide de la nouvelle opération intermédiaire Stream::gather(Gatherer), qui traite les éléments du flux en leur appliquant un 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]]
- Ajout d'une troisième implémentation préliminaire de classes implicitement déclarées et d'instances sans nom de la méthode "main", qui peut se passer des déclarations publiques/statiques, en passant un tableau d'arguments et d'autres entités associées à une déclaration de classe. // était public class HelloWorld { public static void main(String[] args) { System.out.println("Bonjour tout le monde !"); } } // vous pouvez désormais void main() { System.out.println("Hello, World!"); }
- Ajout d'un deuxième aperçu d'une fonctionnalité qui permet aux constructeurs de spécifier des expressions avant d'appeler super(...), utilisée pour appeler explicitement le constructeur d'une classe parent à partir du constructeur d'une classe héritée si ces expressions ne font pas référence à une instance créée par le constructeur. class Outer { void hello() { System.out.println("Bonjour"); } classe Intérieure { Intérieure() { bonjour(); super(); } } }
- Ajout d'une troisième implémentation préliminaire de Scoped Values, permettant de partager des données immuables entre les threads et d'échanger efficacement des données entre les threads enfants (les valeurs sont héritées). Les valeurs scoped sont en cours de développement pour remplacer le mécanisme des variables locales des threads et sont plus efficaces lors de l'utilisation d'un très grand nombre de threads virtuels (des milliers ou des millions de threads). La principale différence entre les valeurs Scoped et les variables locales du thread est que les premières sont écrites une seule fois, ne peuvent pas être modifiées à l'avenir et restent disponibles uniquement pendant la durée de l'exécution du thread.
- Un troisième aperçu de l'API Structured Concurrency a été proposé pour les tests, simplifiant le développement d'applications multithread en traitant plusieurs tâches exécutées dans différents threads en un seul bloc.
- Les méthodes d'accès à la mémoire externe (en dehors de la JVM) fournies par la classe sun.misc.Unsafe sont obsolètes et leur suppression est programmée. Pour accéder à la mémoire hors tas et interagir avec du code externe, il est recommandé d'utiliser l'API VarHandle et l'API FFM (Foreign Function & Memory).
De plus, on peut noter la publication d'une mise à jour de la plateforme de création d'applications avec l'interface graphique JavaFX 23 et l'inclusion du compilateur GraalVM JIT dans le principal Oracle JDK 23.
Une nouvelle version de la machine virtuelle universelle GraalVM est également présentée, qui prend 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 lequel le bitcode LLVM peut être généré (C , C++, Rust). En plus de prendre en charge le JDK 23, la nouvelle version optimise la consommation de mémoire et la taille du code exécutable, et fournit une prise en charge complète des outils d'intégration de Python et WebAssembly dans le code Java à l'aide de la compilation JIT.
Source: opennet.ru

