Blog Arolla

Quelles nouveautés pour Java 15 ?

Le JDK 15 est sorti aujourd’hui, l’occasion donc de présenter les principaux changements apportés par cette version.

Les classes sealed

C'est la grosse nouveauté de Java 15, nécessaire à l’arrivée du filtrage par motif dans le langage, les sealed classes ont pour objectif de restreindre l’implémentation ou l’héritage de celles-ci.
La déclaration d’une classe comme sealed se fait de la manière suivante :

package com.example.geometry;

public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

Le mot clef permits sert à lister les classes autorisés à hériter de la sealed class.
Il est aussi possible d’inclure ces sous-classes directement dans le même fichier où la sealed class est déclarée, sans avoir à définir permits :

package com.example.geometry;

abstract sealed class Shape {...}
... class Circle    extends Shape {...}
... class Rectangle extends Shape {...}
... class Square    extends Shape {...}

Grâce aux sealed classes, il sera prochainement possible de faire du filtrage par motif de cette manière :

int getCenter(Shape shape) {
    return switch (shape) {
        case Circle c    -> ... c.center() ...
        case Rectangle r -> ... r.length() ...
        case Square s    -> ... s.side() ...
    };
}

Les sealed classes apportent cependant quelques contraintes :

  • L'héritage doit être explicité dans la classe parente
  • Les sealed classes et leur sous classes doivent être dans le même module ou dans le même package
  • Les sous classes doivent directement hériter de leur sealed classe
  • Les sous classes doivent être déclarées comme sealed, non-sealed ou final pour décrire comment la hiérarchie de celles-ci s'achève.

Notez qu’une interface peut aussi être définit comme sealed.
Cette fonctionnalité est disponible en aperçu et sera rendu finale avec le JDK 16 ou 17.

Les Text Blocks en version définitive

Apparu avec le JDK 13, légèrement modifié avec Java 14, les Text Blocks, qui comme leur nom l’indique permettent d’écrire un bloc de chaînes de caractères sur plusieurs lignes sans concaténation sont enfin disponible en version définitive dans Java 15.

String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

Légère évolution des Records

Présentés avec le JDK 14, les Records sont des POJO moins verbeux.

record Point(int x, int y) { }

Ils restent en aperçu dans Java 15 et évoluent légèrement.
Tout d'abord, un record peut implémenter une sealed interface :

package com.example.expression;

public sealed interface Expr
     permits ConstantExpr, PlusExpr, TimesExpr, NegExpr {...}

public record ConstantExpr(int i)       implements Expr {...}
public record PlusExpr(Expr a, Expr b)  implements Expr {...}
public record TimesExpr(Expr a, Expr b) implements Expr {...}
public record NegExpr(Expr e)           implements Expr {...}

Ensuite, on peut maintenant déclarer un record localement au sein d'une méthode :

List<Merchant> findTopMerchants(List<Merchant> merchants, int month) {
    // Local record
    record MerchantSales(Merchant merchant, double sales) {}

    return merchants.stream()
        .map(merchant -> new MerchantSales(merchant, computeSales(merchant, month)))
        .sorted((m1, m2) -> Double.compare(m2.sales(), m1.sales()))
        .map(MerchantSales::merchant)
        .collect(toList());
}

Suppression du moteur Nashorn

Nashorn, le moteur JavaScript introduit avec JDK 8, déprécié avec Java 11, est supprimé car il était trop coûteux à maintenir en vu de la très rapide évolution d'ECMAScript.

Livraison de nouveaux Garbage Collectors

Les ramasses miettes ZGC et Shenandoah ne sont plus expérimentaux et sont livrés en version finale dans le JDK 15. Cependant G1 reste pour le moment le ramasse miette par défaut.

Le JDK sur GitHub

OpenJDK, qui utilisait Mercurial depuis 2008 comme logiciel de gestion de version a migré le JDK vers Git pour différentes questions d’outillage et d’hébergement, et c’est finalement GitHub qui a été sélectionné pour héberger le code source du JDK.

Conclusion

Pour découvrir l'ensemble des changements apportés, je vous invite à vous rendre sur la page du JDK 15 ou sur le JDK Bug System.
Pour ma part, je vous donne rendez-vous dans six mois pour découvrir les nouveautés qu'apportera Java 16 avec entre autres la possibilité d’utiliser des fonctionnalités de C++14 et très probablement l’arrivée du filtrage par motif.

Plus de publications

Comments are closed.