De Java 8 à Java 17 : Un voyage passionnant

De Java 8 à Java 17 : Un voyage passionnant

De java 8… à java 17 ! Neuf versions en 4 ans. Un marathon qui a plus ou moins transformé ce langage populaire. Dans ce premier EntreDev 🔥, nous essayerons de faire un tour d’horizon du paysage actuel : du nouveau cycle de release, en passant par les certifications, jusqu’aux nouveautés majeures de la JVM, les APIs et un aperçu du futur.

Le Nouveau Cycle de Release 🚂

Depuis septembre 2017, avec la sortie de Java 9, le cycle de publication du JDK est passé à une version de fonctionnalité tous les six mois. Avant cela, il n’y avait qu’une version tous les deux ans, ce qui donnait l’impression que le langage lui-même évoluait lentement comparé à ses concurrents. Les versions de support à long terme (Long Term Support ou LTS) sont désormais disponibles tous les deux ans (à partir de Java 17).

Ce changement est accompagné d’un changement de licence. Pas de panique ! En fait, Java est toujours gratuit. Mais ne me croyez pas sur parole, les champions de java sont venus à notre secours avec leur article.

Bref, le JDK Oracle est désormais payant pour être utilisé en production à partir du 8u211 (avril 2019), à l’exception du tout dernier LTS (actuellement Java 17) qui reste gratuit (oui, même en production). Oracle fournit également un OpenJDK qui est livré sous une licence open-source (enfin, en quelque sorte). De nombreux autres fournisseurs vous proposent leurs versions. Principalement en ajoutant leur propre couche de performances et de services de support. Pour n’en citer que quelques-uns : Alibaba, Amazon, Azul, BellSoft, Eclipse Adoptium (successeur d’AdoptOpenJDK ), IBM, Microsoft, Red Hat, Oracle, SAP et autres.

Obtenir La Certification 🎓

Si vous vous demandez comment obtenir une certification, vous avez de la chance ! La certification Java 11 (qui est une version LTS) est disponible, le « Java SE 11 Developer » (1Z0-819).

Cet examen a remplacé d’autres examens que vous auriez pu rencontrer :

•  Examens 1Z0-815 et 1Z0-816, retirés le 1er octobre 2020.
•  1Z0-817 Upgrade OCP Java 6, 7 & 8 to Java SE 11 Developer, retiré le 30 novembre 2021.

Cependant, l’examen Java 17 n’a pas encore été annoncé.

Sous Le Capot 🔧

Il n’y aurait pas de mises à jour majeures sans une amélioration des performances et de la sécurité, et Java a fourni de sérieuses mises à jour à cet égard.

Performances et Sécurité ⚡

Depuis Java 9, nous avons eu des modules et le JDK est lui-même devenu modulaire (Project Jigsaw 🧩). Les modules, qui regroupent eux même des packages, nous accordent un contrôle plus fin sur la manière d’exposer nos APIs et permettent la déclaration de nos dépendances. Bien qu’ils soient facultatifs à utiliser, ils sont puissants et compatibles avec l’approche classpath traditionnelle. En effet, cela crée naturellement la possibilité de créer des runtimes java plus petites, couplé sujet ci-dessous.
 

Et avec cette même version, les chaînes Java sont désormais stockées dans un tableau d’octets (bytes) au lieu d’un tableau de caractères (char = 2 octets). Les strings Latin-1/ISO-8859-1 sont encodés sur 1 octet par caractère, tandis que ceux de UTF-16 obtiennent 2 octets par caractère.

Java 10 amène une meilleure compatibilité avec les containers. Nous pouvons donc mieux détecter et définir les limites du processeur et de la mémoire (pour info, ceci a été back-porté vers Java 8u191). Et puisque nous parlons de mémoire, l’échantillonnage des allocations du Java heap peut désormais être effectué avec une surcharge réduite sous Java 11.

TLSv1.3 est disponible à partir de Java 11. Et il y a plus de contrôle sur la validation des données de sérialisation, ce qui aide à réduire les risques de sécurité.
D’autres nouveautés peuvent améliorer les temps de démarrage des applications : les améliorations du partage de données de classe (Class Data Sharing, CDS) et l’introduction d’AppCDS .
Nous nous sommes également dotés de nouvelles plates-formes prises en charge comme le nouveau processeur d’Apple (MacOS/AArch64), Alpine Linux et Windows/AArch64 entre autres.

Garbage Collectors 🛒

Le garbage-collector est toujours au centre de mises à jour majeures. À partir de Java 9, G1GC est le GC par défaut, et pour Java 10, ce GC a été amélioré en rendant le full GC parallèle. Dans Java 12, G1GC peut renvoyer la mémoire de heap au système hôte et Java 14 l’a rendu compatible avec l’architecture NUMA.

Mais G1GC n’est pas le seul GC nous est disponible, les autres GC sont :
• Le ZGC, visant à être un GC scalable et sans pause.
Shenandoah, minimisant également les pauses et ciblant de très gros heap.
Epsilon GC, qui ne fait pas vraiment de garbage-collection, il ne gère en fait que l’allocation. Il est utile pour les benchmarks et les applications intégrées.

Tooling 🔨

Avec Java 9, un shell java, le jshell est à notre disposition pour faire des expérimentations rapides :

Dans ce contexte, Java 11 nous offre 2 possibilités supplémentaires de « scripting » en exécutant :
•    Un seul fichier Java sans le compiler explicitement, la compilation se produit en mémoire dans les coulisses.
•    Un « java-script » via Shebang (comme les scripts shell), nous pointons simplement vers notre installation java dans l’entête #!. Attention, le fichier ne doit pas se terminer par « .java », un fichier sans extension fonctionnera très bien.

Naturellement, avec java 9, jdeps prend désormais en charge le système de modules.
jlink nous permet de créer un runtime java avec les modules JDK utilisés par notre application uniquement.
jpackage, en java 16, utilise jlink pour nous permettre de créer une application distribuable entièrement fonctionnelle sans exigences supplémentaires sur la machine cible, il prend en charge de nombreuses plates-formes et il est assez flexible.
Enfin, le Flight Recorder fait partie de l’OpenJDK depuis Java 11.

Une Sélection d’API 🔌

Dans cette section, je vais énumérer une sélection de diverses nouvelles API qui peuvent être très utiles. Mais avant d’entrer dans ces détails, j’aimerais rappeler qu’à partir de Java 9, nous avons des modules incubateurs qui sont « un moyen de mettre des API non finales et des outils non finaux entre les mains des développeurs ». Cela donne aux développeurs un accès rapide et plus facile aux nouvelles fonctionnalités et améliore considérablement le cycle de feedback.

Factory Methods des Collections :

List, Map et Set ont maintenant of() et copyOf() qui renvoient des collections non modifiables des éléments passés en paramètres (Java 9).

Les opérateurs de flux :

dropWhile() et takeWhile() sont de nouvelles méthodes qui nous permettent de continuer à accepter ou à supprimer des éléments d’un flux tant qu’une condition est vraie (Java 9).

Nous avons également de nouvelles façons de générer des flux via une surcharge de Stream.iterate(), une méthode ofNullable() et la possibilité de convertir un Optional en un Stream avec la méthode stream() (Java 9).

toUnmodifiableList(), toUnmodifiableSet() comme leurs noms l’indiquent sont de nouveaux collecteurs qui collectent respectivement en List et Set non modifiables (Java 10). Un autre ajout de collecteur est Collectors.teeing() nous permettant d’appeler plusieurs collecteurs sur le même flux puis faire fusionner les résultats (Java 12).

Arrays.mismatch()

Renvoie l’indice du premier élément qui ne match pas dans 2 tableaux (Java 9).

Local Variable Type Inference

Ou, inférence de type de variable locale, qui veux dire que nous pouvons utiliser le célèbre mot-clé var pour déclarer des variables dans un scope local (Java 10).

HttpClient && WebSocketClient

Client raffiné pour HTTP prenant en charge HTTP/2 avec des appels asynchrones et un client WebSocket pratique (Java 11).

Files.mismatch()

Comme Arrays.mismatch() mais pour les fichiers (Java 12).

Strings

De nombreuses méthodes utiles ont été ajoutées : isBlank() pour vérifier si la chaîne est vide ou contient simplement des espaces blancs, lines() renvoie un flux de lignes dans la chaîne, repeat() renvoie une répétition de n fois de la chaîne (Java 11). Le CompactNumberFormat offre une nouvelle façon de formater les nombres (Java 12).

Switch Expression

Switch peut être utilisé comme une expression renvoyant une valeur. Mais ça ne s’arrête pas là, il peut également être utilisé avec la nouvelle syntaxe de flèche moderne (comme les lambdas), “no fall through syntax” (Java 14) :

Text Blocks

Prise en charge du texte multiligne à l’aide des trois double-quotes : «  » » (Java 15).

Des Messages NPE plus Parlants

Les messages des NPEs indiquent explicitement la variable nulle qui est à l’origine de l’exception, ce qui nous facilite énormément le débogage (Java 15).

Records

Nouveau type, comme des classes qui sont finaux et immuables (en quelque sorte). Ils peuvent être très utiles comme classes de données (data-class) par exemple (Java 16).

Pattern Matching

Par exemple (Java 16) et switch (Java 17-prev), faisant correspondre un objet à son type et simplifiant le casting :

Sealed Classes

Un moyen de figer toute la hiérarchie des classes en spécifiant explicitement quelles classes (ou enregistrements) sont autorisées à implémenter/étendre une interface/classe (Java 17).

Toujours Dans L’Incubator

Dans les modules d’incubateur mentionnés précédemment, nous avons une nouvelle API pour utiliser la mémoire off-heap qui vise à être plus efficace et simple pour les développeurs. Et un autre qui est tout aussi important est l’API Vector, permettant un calcul performant sur les vecteurs et économisant des cycles CPU.

Dans la cuisine 🍳

Cet article ne fait que gratter la surface et n’est en aucun cas exhaustif. Chaque point est un candidat pour son ou ses propres articles. Et ce qui nous attend avec les prochaines versions pourrait nécessiter notre attention.

Dans Java 18, à venir le 22 mars 2022, nous aurons par exemple :

• Un serveur Web HTTP simple pour les fichiers statiques
• Plus d’API Vector (incubator)
• Plus d’API pour accès off-heap (incubator)
• UTF-8 comme charset par défaut

Et dans un futur plus lointain :
• Plus de pattern matching avancé et déconstruction d’objets
• Project Loom, qui amène les “threads virtuels”, plus léger, à Java.

Références 📚

                                                                                                                   Maxime (Hassan) ALISE 

En réagissant à cet article, vous nous permettez d'affiner les contenus que nous publions ici !

  • Sucks (8)
  • Interesting (3)
  • Awesome (1)
  • Useful (1)
  • Boring (1)

Si cet article vous a plu, n’hésitez pas à le partager via