Cette version est la nouvelle LTS, elle apporte en version stable un certain nombre de changement attendus, et encore des étapes sur des travaux de fond pour le long terme !

Si vous avez loupé la version 20, vous pouvez retrouver tout le détail de cette version dans mon article dédié.

Note sur les LTS : beaucoup attendent les LTS pour mettre à jour comme des gages de fiabilités, mais à moins de payer une licence pour le JDK Oracle, toutes les versions d'OpenJDK ont le même niveau de support, ce qui implique que ça n'apporte rien d'attendre une "LTS" qui n'a rien de Long Term Support à part encaisser une marche plus haute que si on prenait le petit pas que représentent les versions intermédiaires.

Sequenced Collections

Depuis toujours en Java on a du mal à exprimer l'accès au premier élément d'une collection, au dernier, ajouter au début, ajouter à la fin, supprimer le premier élément, supprimer le dernier élément ou inverser une collection. Avec la JEPS 431, c'est maintenant corrigé. Nous avons maintenant les interfaces SequencedCollection, SequencedSet et SequencedMap. Celle-ci sont implémentés/étendues par les classes qui vont bien pour qu'on puisse en profiter au maximum au quotidien.

On notera aussi l'ajout sur la classe Collections de trois méthodes statiques : unmodifiableSequencedCollection(sequencedCollection), unmodifiableSequencedSet(sequencedSet) et unmodifiableSequencedMap(sequencedMap), pour rendre immuable les différentes collections.

Switch Pattern Matching enfin release !

En Java 21 les JEPS 440 et 441 viennent passer en release après 4 versions en preview le switch pattern matching. Sans aucun flag, on peut donc en Java 21 écrire ce genre de code :

record Point(int x, int y) {}

static void nullMatch(Object obj) {
    switch (obj) {
        case null      -> throw new NullPointerException();
        case String s  -> System.out.println("String: " + s);
        case Integer i -> System.out.println("Integer");
        case Point(int x, int y) -> System.out.println("Point " + x + " " + y);
        default        -> System.out.println("default");
    }
}

On peut donc trier nos objets avec des switchs en jouant sur du pattern matching au niveau des types, aussi bien natif que sur les record, on pourra aussi faire directement de la destructuration (ce qu'on voit ici avec le record Point), et même imbriquer la destructuration ! On a beaucoup d'option qui s'ouvre tout doucement pour plus simplement gérer nos données, il n'y a plus qu'à expérimenter !

Les Virtual Threads

Les threads virtuels sont apparus en Java 19 en preview, en Java 20 une nouvelle preview était venu compléter l'implémentation, ici nous arrivons sur une release. Les threads virtuels vont considérablement améliorer les performances de nos applications web, tout en nous permettant d'écrire un code plus simple car utilisant une syntaxe bloquante.

Des expérimentations sont menées ici et là sur l'impacte d'utiliser en combinaison Reactor (ou une autre librairies de flux) avec les virtual threads, l'impacte sur les performances que ça entraine. Il est encore trop tôt pour avoir un vrai recul, mais on pourrait avec un gain supplémentaire à mixer les deux approches. Même si l'utilisation de code bloquant sur les threads virtuels semble le plus pertinent si on a pas besoin d'aller chercher des performances encore plus grandes.

Divers améliorations

La JEP 439 apporte une nouvelle amélioration du Garbage Collector ZGC avec une nouvelle stratégie pour améliorer son efficacité.

On voit aussi arrivé les String Templates avec la JEP 430, permettant d'écrire du code qui ressemble à ce qu'on retrouve dans beaucoup de langage :

String title = "My Web Page";
String text  = "Hello, world";
String html = STR."""
        <html>
          <head>
            <title>\{title}</title>
          </head>
          <body>
            <p>\{text}</p>
          </body>
        </html>
        """;

Où on voit qu'on pourra faire de l'interpolation, et aussi appliquer un template processor (ici STR. qui sera le template processor de base). On pourrait donc imaginer à l'avenir un template processor dédié par exemple aux requêtes SQL qui permettra d'utiliser des strings templates tout en se protégeant des injections SQL.

On trouve aussi l'arrivée en preview de la possibilité d'avoir une méthode main qui ne serait pas définie dans une classe. Ceci permettrait essentiellement une entrée plus simple dans le langage Java.

Conclusion

On retrouve pas mal de nouveautés dans cette version qui sera la version de référence pour beaucoup sur les 2 prochaines années en attendant la version 25. Des nouveautés commencent à émerger tout doucement, et pas mal de preview dont je n'ai pas parlé ont été mises à jour (sans dire qu'aucun travail n'a été effectué, ce n'est pas aussi important que ce dont j'ai parlé à mon sens).

Sources :

Crédit photo : https://unsplash.com/fr/photos/une-personne-tenant-un-morceau-de-papier-avec-des-cartes-a-jouer-dessus-Wfe_gWCpciU