Java 12 : quoi de neuf ?

Java 12 : quoi de neuf ?

Maintenant que Java 12 est features complete (Rampdown Phase 2 au jour d’écriture de l’article), c’est le moment de faire le tour des fonctionnalités qu’apporte cette nouvelle version, à nous, les développeurs.

Cet article fait parti d’une suite d’article sur les nouveautés des dernières version de Java, pour ceux qui voudrait les lires en voici les liens : Java 11, Java 10, et Java 9.

Et force est de constater qu’à part les switch expression, il n’y a pas beaucoup de nouveautés à destination des développeurs, on a faillit avoir des Raw String (string multi-ligne) mais la fonctionnalité a été supprimée de la release au dernier moment, espérons qu’elle réapparaîtra bientôt …

JEP 325: Switch Expressions

C’est la principale nouvelle fonctionnalité de Java 12, les switch expressions permettent de définir des switchs en tant qu’expression pour en récupérer le résultats dans une variable, le switch ne va donc plus être juste une structure de contrôle (ensemble de if/else) mais permettre de calculer un résultats.

Une nouvelle syntaxe des switchs a été ajoutée, plus pratique d’utilisation et plus concise, qui utilise l’opérateur arrow déjà utilisé dans les lambda : ‘->’. On peut utiliser cette nouvelle syntaxe aussi bien dans un switch classique que dans un switch expression.

Voici un exemple de la nouvelle syntaxe qui utilise l’opérateur arrow, on peut noter que le break n’est plus nécessaire ici, cette nouvelle forme de switch ayant un break implicite :

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

Voici un exemple de switch expression qui permet de calculer un entier représentant le numéro de jour, notez la présence du ‘;’ en fin d’expression qui indique bien que nous ne sommes plus ici dans une structure de contrôle mais bien une expression :

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    case THURSDAY, SATURDAY     -> 8;
    case WEDNESDAY              -> 9;
};

Dans cet exemple, chaque case étant sur une ligne, on a un break implicite de la variable (ici un entier littéral).

Il est possible d’écrire des case sur plusieurs lignes, on doit alors écrire un break à la fin du bloque de code avec la valeur que doit retourner l’expression :

int j = switch (day) {
    case MONDAY  -> 0;
    case TUESDAY -> 1;
    default      -> {
        int k = day.toString().length();
        int result = f(k);
        break result;
    }
};

Pour l’instant, ce nouveau switch est en mode preview, pour l’utiliser il faut ajouter l’option –enable-preview à la ligne de commande Java, espérons qu’il sera en final dans la prochaine version …

Plus d’info dans la JEP : https://openjdk.java.net/jeps/325

Divers ajouts :

– https://bugs.openjdk.java.net/browse/JDK-8200435 String::align et String::indent : permet d’aligner une string multi-ligne ou de l’indenter.
– https://bugs.openjdk.java.net/browse/JDK-8203442 String::transform : créé une nouvelle String par transformation de la première via une lambda fonction.
https://bugs.openjdk.java.net/browse/JDK-8202285Files::isSameFile : permet de comparer deux fichiers pour savoir s’ils sont identique (même contenu).
– https://bugs.openjdk.java.net/browse/JDK-8205461 : Collectors::teeing : créé un collecteur qui est la composition de deux autres
– https://bugs.openjdk.java.net/browse/JDK-8177552java.text.CompactNumberFormat permet de formater des nombres dans une forme compacte telle que définie par la norme LDML : 1000 -> 1K, 1000000 -> 1M, …

JEP 341: Default CDS Archives

CDS : Class Data Sharing est une fonctionnalité de la JVM qui permet de réduire le temps de démarrage de celle-ci, en enregistrant dans un fichier les metadatas des classes (leur représentation dans la JVM), pour une réutilisation lors du prochain lancement de la JVM. Avec la JEP 341, les classes du JDK seront pré-processé via le mécanisme CDS au moment de la création de la JVM, et chargées par défaut au démarrage (pas besoin d’argument spécifique dans la ligne de commande). On profitera donc gratuitement du mécanisme de CDS pour les classes du JDK!

Plus d’info dans la JEP: https://openjdk.java.net/jeps/341

JEP 189: Shenandoah: A Low-Pause-Time Garbage Collector

Le petit nouveau Garbage Collector (GC): Shenandoah. Développé par Redhat et déjà inclus depuis plusieurs mois dans leur JVM, il est intégré en tant que fonctionnalité expérimentale dans Java 12.

Comme ZGC, c’est un GC qui est concurrent à l’application et qui promets des pauses minimale (de l’ordre de la milliseconde) pour des heap de très grande taille (plusieurs centaines de Go). Il vise les heaps de grande taille et les machines à plusieurs cœurs.

Pour l’activer :

-XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC.

Plus d’info dans la JEP: https://openjdk.java.net/jeps/189

JEP 346: Promptly Return Unused Committed Memory from G1

Une fonctionnalité qui permet au Garbage Collector G1 de retourner à l’OS de la mémoire quand il n’en a plus besoin. Pour cela il ajoute un cycle de GC périodique, et se base sur le load average de la machine pour savoir son utilisation, et ainsi décider de retourner ou pas de la mémoire à l’OS. Cette fonctionnalité est désactivée par défaut et peut être activée via :

-XX:G1PeriodicGCInterval=5000 -XX:G1PeriodicGCSystemLoadThreshold=1

Plus d’info dans la JEP: https://openjdk.java.net/jeps/346

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.