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 : « Java Is Still Free ». 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 🎓
Sous Le Capot 🔧
Performances et Sécurité ⚡
Garbage Collectors 🛒
Tooling 🔨
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.
• En exécutant 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