Les nouveautés à utiliser au quotidien pour nous les développeurs entre les versions LTS de Java : 11 à 17.
Signaler
Partager
Signaler
Partager
1 sur 53
Contenu connexe
Java 11 to 17 : What's new !?
1. Java 11 -> 17
Quoi d’neuf entre les 2 LTS ?
JÉRÔME TAMBORINI
EQUIPE LEASA
2. Qui c’est lui !?
Jérôme Tamborini
10+ XP Dev (Backend – Java SE/EE)
Leasa
Archi – Team Manager
LorraineJUG
Fin 2021 – Début 2022
3. Java 11 -> 17 - Quoi d’neuf entre les
2 LTS ?
Plan
Le « nouveau » mode de release de Java
Pourquoi ?
Comment ?
Les distributions du JDK
Java 11 -> Java 17
Pour nous, les devs
A savoir
Java en production en 2021
Le code source des exemples
https://github.com/jerometambo
4. Le « nouveau » mode de release de
Java
1 version de Java / 6 mois
Updates mineures pendant 6 mois
Une version LTS toutes les 6 versions
11, 17, 23, etc.
Tous les 3 ans
5. Le « nouveau » mode de release de
Java
Répond à plusieurs problématiques du langage
Une release toutes les X années
Dur de prévoir les évolutions
Surtout pour les créateurs de libs / frameworks
Permet de mettre des features en mode « beta »
Avant de les changer de package et de les valider
Ou de les supprimer !
7. Mode « beta »
Des features/évolutions du langage en mode
Preview
Incubating (incubator modules)
Experimental
Permet de tester et/ou préparer ses évolutions
Développeurs
Frameworks / libs
Feedback des utilisateurs pour les équipes JDK
Développeurs
8. Mode « beta »
Preview
A activer via un flag à la compil’
9. Mode « beta »
Incubator
Evolutions d’APIs
Outils
Dans un module (au sens Java 9) à explicitement ajouter
10. Mode « beta »
Experimental
Evolutions de la JVM
A activer via des flags JVM
Les releasers de JDKs sont libres d’activer / désactiver arbitrairement des
features expérimentales
12. Les distributions du JDK
OracleJDK
Gratuit en dev.
Payant en production
News du 15/09/2021
https://blogs.oracle.com/cloud-infrastructure/post/introducing-free-java-license
OpenJDK
AdoptOpenJDK Adoptium
Azul Zulu
Microsoft
Oracle
Redhat
Etc.
14. Les distributions du JDK
C’est quoi Oracle OpenJDK ?
Code source du JDK
Ne propose pas de builds du JDK
Quoi choisir ?
Adoptium (ex AdoptOpenJDK)
15. Java 11
Pour les devs
Nouvelles méthodes de String, Files et Optional
HTTP Client
Lancer un .java en une commande
Java Flight Recorder & Java Mission Control
A savoir
Moteur JS Nashorn déprécié
ZGC
Crypto : ChaCha20 and Poly1305
17. Java 11 – HTTP Client
Une des features les plus utilisées
Les classes dataient de … Java 1.0 !
(Très) verbeux
Dépendances
Apache HTTP Client, OkHttp, etc.
19. Java 11 – JFR & JMC
Java Flight Recorder
Outil de profiling
Au runtime
Exploitation à froid
Collecte des infos sur l’environnement l’appli et la JVM
Stocke tout dans un fichier .jfr
Java Mission Control
Ouvre les fichiers JFR
Semblable à VisualVM et consorts
20. Java 12
Pour les devs
On continue les news sur String
Compact number formatting
A savoir
Teeing collector
Microbenchmark
Changements de la JVM
27. Java 13
Pas mal d’évols en « preview »
Switch expression
Text blocs
A savoir
Dynamic CDS
Nouvelle implem’ de la Legacy Socket API
ZGC: Uncommit Unused Memory
Unicode support mis à jour vers 12.1
Support de « Kerberos principal name canonicalization and cross-realm
referrals »
etc.
28. Java 14
Pour les devs
Switch expression
Parle-moi NPE, parle-moi !
En preview
Pattern matching for instanceof
Records
Text block (2nd)
A savoir
ZGC
JFR Event Streaming
etc.
29. Java 14 – switch expression
Structure de contrôle existante depuis Java 1.0
Pas évoluée depuis Java 1.0
Souvent répétitive
Fall through par défaut
Pour permettre d’exécuter un même traitement pour plusieurs valeurs
Origine de nombreux bugs : oubli de break
30. Java 14 – switch expression
Simplification de l’écriture
Utilisation de -> en lieu et place de :
Plus de Fall through
Plus de break
Utilisée pour
Structure de contrôle (comme avant)
Une expression (nouveauté)
Valeurs multiples dans les clauses case
Avec les 2 méthodes d’écriture
32. Java 14 – Switch Expression
switch comme structure de contrôle
avec la syntaxe historique
« vieux switch »
Fall-throught par défaut
default facultatif
switch comme structure de contrôle
avec la nouvelle syntaxe
Chaque case doit avoir une instruction
ou un bloc de code
Pas de fall-through
default facultatif
switch comme expression avec la syntaxe
historique
Fall-throught par défaut
Exhaustivité des cas obligatoire
yield pour retourner une valeur
default obligatoire
switch comme expression avec la nouvelle
syntaxe
Chaque case doit retourner une valeur ou lever
une exception, yield pour retourner une valeur
dans un bloc de code
Pas de fall-through
Exhaustivité des cas obligatoire
default obligatoire
34. Java 15
Pour les devs
Text Blocks
En preview
Sealed classes
Pattern matching for instanceof (2nd)
Records (2nd)
A savoir
Hidden classes
Le moteur JS Nashorn est supprimé
Shenandoah GC
RMI Activation déprécié et taggué forRemoval
etc.
39. Java 16 – Records
Le pourquoi de ce nouveau type ?
Encapsulation de données en java
Beaucoup de code
Constructeur (avec les paramètres de tous les attributs)
Getters & setters
Equals
Hashcode
toString
Le dev non auteur de la classe
Doit lire toute la classe pour comprendre que c’est juste une encapsulation de données
Ou lit la javadoc,… mais comme pas certain qu’elle soit à jour
Doit lire toute la classe pour comprendre que c’est juste une encapsulation de données
41. Java 16 – Records
Compilé par le compilateur comme tout autre type
Génération d’une classe final
Hérite de java.lang.Record
Composant : champ private final
Getters
equals(), hashCode() et toString()
Possible
Redéfinition des accesseurs
Méthodes statiques (Factories)
Méthodes d’instances
Pas possible
Ajouter un champ dans le corps
Ne peut hériter d’une classe
Abstract ou classe mère
42. Java 17 – Tout frais : 14/09/2021
Qui a contribué ?
43. Java 17 – Tout frais : 14/09/2021
Pour les devs
Sealed classes
Preview & Incubator
Pattern Matching for switch
Foreign Function and Memory API
Vector API (2nd)
A savoir
macOS AArch 64 Port
Enhanced Pseudo-Random Number Generator
Context-Specific Deserialization Filters
Security Manager déprécié (taggué for Removal)
RMI supprimé
44. Java 17 – Sealed classes
Héritage
Depuis quelques années Composition over Heritage
Aucun contrôle des classes filles
Exemple : dans mon domaine business : pas de téléphone
45. Java 17 – Sealed classes
Aujourd’hui, rien ne m’empêche d’hériter d’Appareil
Et de créer ma classe Telephone dans mon domaine
Et d’insérer la gestion d’un concept interdit par mon business dans mon appli
46. Java 17 – Sealed classes
C’est tout le pourquoi des Sealed classes
Ajouter de la lisibilité du code en connaissant les sous classes
Car la réutilisation du code c’est top, mais c’es pas toujours ce qu’on veut faire
En deux mots
Les classes sealed permettent de définir les sous types autorisés
48. Java 17 – Sealed classes
A retenir
Compatible avec les records
Toutes les sous classes autorisées doivent être dans le même module (au sens Java 9)
Toutes les classes autorisées
Doivent explicitement étendre la sealed class
Doivent définir un modifier
final
sealed
non-sealed
49. Java en production en 2021
https://snyk.io/jvm-ecosystem-report-2021/
+ 60% -> JDK 11
En informatique, une version Long-term support ou LTS (en français Support à long terme) désigne une version spécifique d'un logiciel dont le support est assuré pour une période de temps plus longue que la normale.
Je vais expliquer rapidement les différences
En gros des features en mode beta, specs et implems terminées. Plus pour feedback pour ajustements.
Pareil que preview mais Evolutions d’APIs
Outils
Dans un module (au sens Java 9) à explicitement ajouter
Pas trop pour les devs, plus pour les archi voir les ingé systems.
Beaucoup de features dont je vais parler ont été mise dans le JDK en preview une ou 2 versions avant !
A Technology Compatibility Kit (TCK) is a suite of tests that at least nominally checks a particular alleged implementation of a Java Specification Request (JSR) for compliance. It is one of the three required pieces for a ratified JSR in the Java Community Process, which are:
the JSR specification
the JSR reference implementation
the Technology Compatibility Kit (TCK)
Pour faire simple !
* JFR & JMC
* Nashorn deprecation : moteur JS qui avait été mis en java 8 est déprécié
* ZGC : un nouveau GC qui est développé par Oracle et qui promet des temps de pause très courts sur des heaps de plusieurs téraoctets des heaps de plusieurs téraoctets avec des temps de pause faibles (<10 ms) et un impact sur les performances globales des applications (<15% sur le throughput) : clairement fait pour des gens tel que AWS, pas nous.
* Crypto : nouveaux algos
But we already have trim(). Then what’s the need of strip()?
strip() is “Unicode-aware” evolution of trim().
When trim() was introduced, Unicode wasn’t evolved. Now, the new strip() removes all kinds of whitespaces leading and trailing(check the method Character.isWhitespace(c) to know if a unicode is whitespace or not)
Ce n’est pas un mot clé du langage, mais un nom de type réservé, c’est à dire que l’on ne peut plus appeler une classe var
Variables locales
(pas pour les arguments d’une méthode, ni son type de retour, ni un attribut de classe)
Le mot clé var n’est pas une révolution, mais il permet tout comme l’opérateur <> d’améliorer la lisibilité de certains codes.
inférence de type est faite à la compilation, le bytecode généré est exactement le même que lorsque le type est explicité, ce qui assure qu’il n’y a pas d’impact sur la performance.
Evolution depuis Java 1 !
Dispo en mode incubation depuis Java 9 mais officiellement utilisable dans 11
La mode est plus à limiter et supprimer les dépendances
Evolution depuis Java 1 !
Dispo en mode incubation depuis Java 9 mais officiellement utilisable dans 11
La mode est plus à limiter et supprimer les dépendances
Optional<String> describeConstable()
If you look at the String class documentation, it implements two new interfaces from Constants API –
This method returns an Optional containing the nominal descriptor for this instance, which is the instance itself.
String resolveConstantDesc(MethodHandles.Lookup lookup)
This method is part of Constants API and declared in ConstantDesc interface. It resolves this instance as a ConstantDesc, the result of which is the instance itself.
Il s'agit d'un composite de deux collecteurs en aval. Chaque élément est traité par les deux collecteurs en aval. Ensuite, leurs résultats sont transmis à la fonction de fusion et transformés en résultat final.
Le microbenchmark est l'art de mesurer la performance de petits morceaux de code Java. Implémenté de façon incorrecte, le microbenchmark peut produire des résultats non fiables et non représentatifs de la réalité.
La fonctionnalité de Class Data Sharing (CDS) permet de réduire le temps de démarrage et l'empreinte mémoire entre plusieurs machines virtuelles Java. Il permet de partager les métadonnées de classe entre différentes JVM afin de réduire le temps de démarrage et l'empreinte mémoire. Le changement apporté avec Java 12 est que l'archive CDS est activée par défaut.
On peut voir une certaine continuité dans les évols des versions de Java. Le Class Data Sharing a été activé par défaut en 12.
Le processus d'archivage des classes d'application était fastidieux. Pour générer des fichiers d'archive, les développeurs devait faire des trial runs of their applications pour créer une liste de classes, puis la vider dans une archive. Après cela, cette archive pourrait être utilisée pour partager des métadonnées entre les JVM. Avec l'archivage dynamique, JDK 13 a simplifié ce processus. Nous pouvons maintenant générer une archive partagée au moment de la fermeture de l'application. Cela a éliminé le besoin trial runs of their applications,
ZGC : rend la heap à l’OS (surtout pour l’IOT)
FS : Trois nouvelles méthodes ont été ajoutées à la classe FileSystems pour faciliter l'utilisation des fournisseurs de systèmes de fichiers, qui traitent le contenu d'un fichier comme un système de fichiers.
Les types utilisables dans une instruction switch sont toujours les mêmes int, short, byte, char (et leurs wrappers respectifs), énumération et String.
La nouvelle syntaxe
Une nouvelle syntaxe simplifie l’utilisation de l’instruction switch. Elle utilise l’opérateur arrow.
Au-delà du simple remplacement de « : » par « -> », plusieurs simplifications sont introduites.
A la droite de l’opérateur ->, il ne peut y avoir qu’une expression, une instruction unique ou un bloc de code.
Contrairement à la syntaxe historique, si plusieurs instructions doivent être exécutées, il faut les regrouper dans un bloc de code.
Cela est justifié par le fait qu’il n’y a pas de fall-through avec la nouvelle syntaxe.
L’instruction switch n’est plus uniquement une structure de contrôle permettant d’exécuter du code selon la valeur de la variable passée en paramètre. Elle peut aussi être utilisé comme une expression et donc retourner une valeur.
Avec la nouvelle syntaxe, c’est très simple, il suffit de fournir la valeur retournée à la droite de l’opérateur arrow.
L’utilisation de l’instruction switch comme une expression implique plusieurs contraintes :
Toutes les valeurs du type testé doivent être prises en compte : dans la pratique cela implique de toujours utiliser une clause default sauf pour une énumération dont toutes les valeurs sont prises en compte dans les cases
Si le switch est la dernière instruction de la ligne, elle doit se terminer par un « ; »
yield doit aussi être utilisé dans un bloc de code avec la nouvelle syntaxe pour préciser la valeur à retourner.
Switch comme structure de contrôle avec la syntaxe historique
C’est la forme historique bien connue
Fall-throught par défaut
default facultatif
Switch comme structure de contrôle avec la nouvelle syntaxe
Chaque case doit avoir une instruction ou un bloc de code
Pas de fall-through
default facultatif
Switch comme expression avec la syntaxe historique
Fall-throught par défaut
Exhaustivité des cas obligatoire
yield pour retourner une valeur
Switch comme expression avec la nouvelle syntaxe
Chaque case doit retourner une valeur ou lever une exception, yield pour retourner une valeur dans un bloc de code
Pas de fall-through
Exhaustivité des cas obligatoire
-XX:+ShowCodeDetailsInExceptionMessages pour la 14 à partir de 15 option par défaut
1h15 - Hidden Classes :
sont une fonctionnalité JVM qui est pertinente pour les développeurs de framework. Il permet de rendre les implémentations de classe non découvrables en les définissant à l'aide de Lookup::defineHiddenClass. Ce faisant, de telles classes ne peuvent être trouvées ni en utilisant Class.forName ni en les référant dans le bytecode.
Shenandoah GC is the low pause time garbage collector that reduces GC pause times by performing more garbage collection work concurrently with the running Java program. Shenandoah does the bulk of GC work concurrently, including the concurrent compaction, which means its pause times are no longer directly proportional to the size of the heap. Garbage collecting a 200 GB heap or a 2 GB heap should have the similar low pause behavior.
Nashorn
Mis en jdk8, supprimé
RMI
Bien qu’utilisé massivement dans les années 2000 2020 signe le début de la mort de RMI (communication d’objets en 2 applis Java en utilisant la sérialisation).
Cela rendait la saisie, la lecture et la maintenance de ces chaînes complexes et favorise les bugs.
La syntaxe
Le contenu d’un bloc de texte est entouré par un délimiteur de début :
3 double quotes qui se suivent : """
Zéro ou plusieurs caractères espaces
Un retour chariot
Et un délimiteur de fin :
3 double quotes qui se suivent : """
L’indentation accessoire qui est déterminée et supprimée sur toutes les lignes
L’indentation significative qui est conservée
Un bloc de texte est utilisable partout où une String peut être attendue puisque suite à leur compilation, ils sont transformés en objets de type String dans le bytecode.
Jpackage
Installeurs natifs Linux: deb, rpm: macOS: pkg, app in a dmg Windows: exe, msi
Elastic Metaspace
Return unused HotSpot class-metadata (i.e., metaspace) memory to the operating system more promptly, reduce metaspace footprint.
Une différence toutefois : toList renvoie une immutable list donc la ma dernière ligne va planter
Un record est compilé par le compilateur comme tout autre type. Comme pour les énumérations, le compilateur va exploiter les informations fournies dans le code pour générer une classe.
Le compilateur va générer des membres à la classe à partir des informations de description du record :
une classe final qui hérite de la classe java.lang.Record,
chaque composant est défini sous la forme d’un champ private final,
un constructeur public qui attend en paramètre les composants définis dans le record pour initialiser les valeurs de chaque composant,
un accesseur en lecture pour chaque composant,
une redéfinition des méthodes equals(), hashCode() et toString() héritées de la classe Object
Un record est compilé par le compilateur comme tout autre type. Comme pour les énumérations, le compilateur va exploiter les informations fournies dans le code pour générer une classe.
Le compilateur va générer des membres à la classe à partir des informations de description du record :
une classe final qui hérite de la classe java.lang.Record,
chaque composant est défini sous la forme d’un champ private final,
un constructeur public qui attend en paramètre les composants définis dans le record pour initialiser les valeurs de chaque composant,
un accesseur en lecture pour chaque composant,
une redéfinition des méthodes equals(), hashCode() et toString() héritées de la classe Object
Note: In JDK 16, there is a new HttpRequest.newBuilder(HttpRequest request, BiPredicate<String,String> filter) method, which creates a Builder whose initial state is copied from an existing HttpRequest. This builder can be used to build an HttpRequest, equivalent to the original, while allowing amendment of the request state prior to construction – for example, removing headers:
HttpRequest.newBuilder(request, (name, value) -> !name.equalsIgnoreCase("Foo-Bar"))
8 ans de LTS
Enhanced Pseudo-Random Number Generator
new RandomGeneratorFactory class.
make it easy to request an algorithm based on requirements rather than hard coding a specific implementation.
Vector API
Second incubator - runtime to optimal vector instructions on supported CPU architectures
Security Manager
Datait de 1.0, plutôt côté client lourd
Scellées
Comment améliorer le DDD en continuant à utiliser l’héritage
Scellées
Comment améliorer le DDD en continuant à utiliser l’héritage
Scellées
Comment améliorer le DDD en continuant à utiliser l’héritage
Scellées
Comment améliorer le DDD en continuant à utiliser l’héritage
Scellées
Comment améliorer le DDD en continuant à utiliser l’héritage
En informatique, une version Long-term support ou LTS (en français Support à long terme) désigne une version spécifique d'un logiciel dont le support est assuré pour une période de temps plus longue que la normale.
En informatique, une version Long-term support ou LTS (en français Support à long terme) désigne une version spécifique d'un logiciel dont le support est assuré pour une période de temps plus longue que la normale.
En informatique, une version Long-term support ou LTS (en français Support à long terme) désigne une version spécifique d'un logiciel dont le support est assuré pour une période de temps plus longue que la normale.
En informatique, une version Long-term support ou LTS (en français Support à long terme) désigne une version spécifique d'un logiciel dont le support est assuré pour une période de temps plus longue que la normale.
Prêt pour utiliser toutes les nouvelles features de Java
Donner envie de monter en 17