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 :
[code lang= »java »]
package com.example.geometry;
public abstract sealed class Shape
permits Circle, Rectangle, Square {…}
[/code]
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
:
[code lang= »java »]
package com.example.geometry;
abstract sealed class Shape {…}
… class Circle extends Shape {…}
… class Rectangle extends Shape {…}
… class Square extends Shape {…}
[/code]
Grâce aux sealed
classes, il sera prochainement possible de faire du filtrage par motif de cette manière :
[code lang= »java »]
int getCenter(Shape shape) {
return switch (shape) {
case Circle c -> … c.center() …
case Rectangle r -> … r.length() …
case Square s -> … s.side() …
};
}
[/code]
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
oufinal
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.
[code lang= »java »]
String html = « » »
<html>
<body>
<p>Hello, world</p>
</body>
</html>
« » »;
[/code]
Légère évolution des Records
Présentés avec le JDK 14, les Records sont des POJO moins verbeux.
[code lang= »java »]
record Point(int x, int y) { }
[/code]
Ils restent en aperçu dans Java 15 et évoluent légèrement.
Tout d’abord, un record
peut implémenter une sealed interface
:
[code lang= »java »]
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 {…}
[/code]
Ensuite, on peut maintenant déclarer un record
localement au sein d’une méthode :
[code lang= »java »]
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());
}
[/code]
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.