Sortie de la plateforme Java SE 22 et implémentation de référence ouverte OpenJDK 22

Après six mois de développement, Oracle a publié Java SE 22 (Java Platform, Standard Edition 22), 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 22 conserve 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 22 est entièrement open source sous licence GPLv2, avec des exceptions GNU ClassPath permettant une liaison dynamique avec des produits commerciaux.

Java SE 22 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). Le support public de la branche LTS de Java SE 11 a pris fin en septembre dernier, mais le support étendu se poursuivra jusqu'en 2032. La prise en charge étendue de la branche LTS de Java SE 8 se poursuivra jusqu'en 2030.

Rappelons qu'à partir de la sortie de Java 10, le projet est passé à un nouveau processus de développement, impliquant un cycle plus court pour la formation des nouvelles versions. Les nouvelles fonctionnalités sont désormais développées dans une branche principale constamment mise à jour, qui comprend des modifications prêtes à l'emploi et à partir de laquelle des branches sont créées tous les six mois pour stabiliser les nouvelles versions.

Les nouvelles fonctionnalités de Java 22 incluent :

  • Le garbage collector G1 inclut la prise en charge de l'épinglage de région, qui vous permet de fixer temporairement l'emplacement des objets Java en mémoire pour éviter qu'ils ne soient déplacés par le garbage collector et pour permettre aux références à ces objets d'être transmises en toute sécurité entre Java et le code natif. L'épinglage vous permet de réduire la latence et d'éviter de désactiver le garbage collection lors de l'exécution de régions critiques de JNI (Java Native Interface) avec du code natif (lors de l'exécution de ces sections, la JVM ne doit pas déplacer les objets critiques qui leur sont associés afin d'éviter les conditions de concurrence). L'épinglage supprime les objets critiques de la vue du ramasse-miettes, qui peut continuer à nettoyer les zones non épinglées.
  • Une fonctionnalité préliminaire a été ajoutée pour permettre de spécifier des expressions dans les constructeurs avant d'appeler super(...), utilisée pour appeler explicitement un constructeur de classe parent à partir d'un constructeur de classe hérité 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(); } } }
  • L'API FFM (Foreign Function & Memory) a été stabilisée, permettant l'interaction des programmes Java avec du code et des données externes en appelant des fonctions à partir de bibliothèques externes et en accédant à la mémoire en dehors de la JVM, sans recourir à l'utilisation de JNI (Java Native Interface).
  • La prise en charge des variables sans nom et de la correspondance de modèles a été activée - au lieu des variables et des modèles inutilisés mais nécessaires lors de l'appel, vous pouvez désormais spécifier le caractère « _ ». // was String pageName = switch (page) { case GitHubIssuePage (var url, var content, var links, int issueNumber) -> « ISSUE # » + issueNumber ; ... } ; // vous pouvez maintenant String pageName = switch (page) { case GitHubIssuePage(_, _, _, int issueNumber) -> « ISSUE # » + issueNumber ; } ;
  • Une 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); } } });
  • L'utilitaire Java offre la possibilité d'exécuter des programmes Java, fournis sous la forme de plusieurs fichiers de code ou de bibliothèques de classes précompilées, sans compiler séparément ces fichiers et sans configurer le système de build. La nouvelle fonctionnalité facilite l'exécution de programmes dans lesquels le code des différentes classes est séparé dans des fichiers distincts. Prog.java : class Prog { public static void main(String[] args) { Helper.run(); } } Helper.java : class Helper { static void run() { System.out.println("Bonjour!"); } }

    Par exemple, pour exécuter un programme composé de deux fichiers "Prog.java" et "Helper.java" il suffit désormais de lancer "java Prog.java", qui va compiler la classe Prog, définir une référence à la classe Helper, recherchez et compilez le fichier Helper.java et appelez la méthode main.

  • Ajout d'une deuxième implémentation préliminaire de modèles de chaînes, implémentée en plus des littéraux de chaîne et des blocs de texte. Les modèles de chaînes vous permettent de combiner du texte avec des expressions et des variables calculées sans utiliser l'opérateur +. La substitution des expressions est effectuée à l'aide de substitutions \{..}, et des gestionnaires spéciaux peuvent être connectés pour vérifier l'exactitude des valeurs substituées. Par exemple, le moteur SQL vérifie les valeurs substituées dans le code SQL et renvoie un objet java.sql.Statement en sortie, tandis que le processeur JSON surveille l'exactitude des substitutions JSON et renvoie un JsonNode. Requête de chaîne = "SELECT * FROM Personne p WHERE p." + propriété + " = '" + valeur + "'" ; // était une requête d'instruction = SQL."""SELECT * FROM Person p WHERE p.\{property} = '\{value}'"""; // devenu
  • Un septième aperçu de l'API Vector a été ajouté, fournissant des fonctions pour les calculs vectoriels effectués à l'aide d'instructions vectorielles sur les processeurs x86_64 et AArch64 et permettant 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.
  • Une implémentation préliminaire de l'API Stream étendue a été ajoutée pour prendre 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]]
  • Une deuxième version de l'API expérimentale pour la concurrence structurée a été proposée pour les tests, ce qui simplifie le développement d'applications multithread en traitant plusieurs tâches exécutées dans différents threads en un seul bloc.
  • Ajout d'une deuxiè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'une deuxiè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.
  • Le garbage collector parallèle a amélioré les performances lorsque vous travaillez avec de grands tableaux d'objets. L'optimisation a permis dans certains tests avec de larges tableaux d'objets de réduire de 20 % le délai avant de lancer la recherche d'un objet.

De plus, on peut noter la publication d'une mise à jour de la plateforme de création d'applications avec une interface graphique JavaFX 22.

Source: opennet.ru

Ajouter un commentaire