SlideShare une entreprise Scribd logo
#DevoxxFR
10 ans de Devoxx FR
et de Java
Jean-Michel Doudoux
@jmdoudoux
1
Il y a 10 ans
2
• Présent à la keynote de Stephan Janssen à Devoxx Anvers
Annonce à la fin via une vidéo
• https://www.youtube.com/watch?v=CbjZBf-IWek
• A l'hôtel Marriott rive gauche
• Devoxx France
Des moments mémorables
3
Java a évolué sur la décade
4
• Avec pas moins de 10 versions publiées
grâce au nouveau modèle de releases
• Avec un accueil partagé/mitigé selon les versions
qui sont passés par différentes couleurs de l’arc en ciel
• Trois versions LTS
Java 10,12, 13, 14, 15, 16 : transparence
Java 8 : fort engouement
Java 11 : adoption (très) lente
Java 17 : bonheur des devs
• Sept versions non-LTS
Java 9 : a cassé l’engouement
Jean-Michel DOUDOUX
5
http://www.jmdoudoux.fr
@jmdoudoux
Co-fondateur du
Auteur de 2 didacticiels
Diffusés sous licence GNU FDL
• Développons en Java (3600 pages)
• Développons en Java avec Eclipse
CTO et
Roadmap
6
• Le présent
• La migration vers Java 11 et 17
• Convaincre l’exploitation
• Le futur
• Le passé
• 10 ans d’évolutions de Java
• Convaincre le management
• Mettre en œuvre la migration
10 ans d’évolutions
de Java
7
2012
8
• La version courante est Java 7 (juillet 2011)
• NIO 2
Path, Files, Glob, WatchService, DirectoryStream, walkFileTree() …
• Des APIs requises pour Java 8 : fork/join, invoke dynamic
• Le projet Coins
try with resources, exceptions multiples dans catch, opérateur diamant,
String dans switch, underscore dans les littéraux numériques
long valeur = 10_000_000_000L;
long valeur = 1_0_0_0_0_0_0_0_0_0_0L;
Java 8
9
• Sortie en mars 2014
• Les expressions Lambda et les références de méthode
• Une approche fonctionnelle du traitement de données
avec l’API Stream
• L’API Date & Time
• Redonne un fort engouement pour Java
• Les méthodes par défaut et static dans les interfaces
• Les classes Optional
• Les annotations répétées
Java 9 : syntaxe
10
• Evolutions mineures dans le langage
@SafeVarags sur des méthodes privées
l’opérateur diamant sur les classes anonymes
try with resources : utilisation directe de variables explicitement final
le caractère _ (underscore) est un mot clé réservé
les méthodes privées dans les interfaces
// Java 7 et 8
public void lire(FileInputStream fis) {
try(FileInputStream fisr = fis) {
// ...
}
// Java 9
public void lire(FileInputStream fis) {
try(fis) {
// ...
}
• Sortie en septembre 2017
Java 9 : API / Outils
11
• JShell : outil de type REPL
tester une portion de code ou expérimenter une API
• API Process
interface ProcessHandle
• Fabriques statiques pour collections immuables
• Stackwalking API
• Flow API (Reactive Streams)
• VarHandle
opérations atomiques/ordonnées via une référence typée à une variable
List<String> lettres = List.of("a", "b", "c", "d");
Java 9 : les modules
12
• Les principaux objectifs proposent d’améliorer :
la fiabilité de la configuration (reliable configuration)
la sécurité avec l’encapsulation forte (strong encapsulation)
la performance
la maintenabilité
• La fonctionnalité la plus impactante … et la plus controversée
• La mise en œuvre implique des contraintes
ruptures (visibilité, accessibilité, organisation du code, …)
• Solutions pour faire cohabiter monde modulaire et non modulaire
• Rendre modulaire une application n’est pas obligatoire
• Création de JRE personnalisés
via l’outil jlink
L’instruction var (Java 10)
13
• Pour faciliter la définition de variables var salutation = "Bonjour";
var bonneChancePourNommerCetteVariable = personnes.stream().collect(...)))))));
var service = new Object() {
void afficher() {}
void calculer() {}
};
service.calculer();
service.afficher();
• Le type inféré est parfois surprenant var liste = List.of("test",1);
List<Serializable & Comparable<? extends Serializable & Comparable<?>>>
En Java 11
List<Serializable & Comparable<? extends Serializable & Comparable<?> &
java.lang.constant.Constable & java.lang.constant.ConstantDesc> &
java.lang.constant.Constable & java.lang.constant.ConstantDesc>
En Java 17
• Nouvelles opportunités
avec les classes anonymes
Map<Integer, Map<String, Map<String, Map<Integer, List<Personne>>>>>
bonneChancePourNommerCetteVariable = personnes.stream.collect(...)))))));
var var = personnes.stream().collect(...)))))));
Java 11
14
• Diffusée en septembre 2018
• Version importante car LTS
• Exécution directe d’un unique fichier .java par la JVM
sans compilation préalable
• API HTTP Client
support HTTP 1.1 et 2, websockets, synchrone/asynchrone
• JDK Flight Recorder
Switch expressions(Java 14)
15
switch (niveau) {
case 1, 2 -> {
System.out.print("Débutant");
System.out.println(" et junior");
}
case 3, 4 -> System.out.println("Confirmé");
case 5 -> System.out.println("Expert");
}
String libelle = switch (niveau) {
case 1, 2 -> "Débutant";
case 3, 4 -> "Confirmé";
case 5 -> "Expert";
default -> {
System.out.println("cas par défaut");
yield "Non défini";
}
};
System.out.println(libelle);
String libelle = switch (niveau) {
case 1, 2 : yield "Débutant";
case 3, 4 : yield "Confirmé";
case 5 : yield "Expert";
default : {
System.out.println("cas par défaut");
yield "Non défini";
}
};
System.out.println(libelle);
switch (niveau) {
case 1, 2 :
System.out.print("Débutant");
System.out.println(" et junior");
break;
case 3, 4 :
System.out.println("Confirmé");
break;
case 5 :
System.out.println("Expert");
break;
}
Blocs de texte(Java 15)
16
• Exprimer une chaîne de caractères littérale multiligne
simplement : basiquement sans séquence d’échappement
• Gestion de l’indentation accessoire/significative en début et fin
en déplaçant le contenu vers la droite
en déplaçant le délimiteur de fermeture vers la gauche
• 2 nouveaux caractères d’échappement
s pour indiquer un espace
<retour_chariot> supprime la fin de ligne
String html = """
<HTML>
<BODY>
<H1>"Hello"</H1>
</BODY>
</HTML>""";
String html = """
<HTML>
<BODY>
<H1>"Hello"</H1>
</BODY>
</HTML>""";
String html = """
<HTML>
<BODY>
<H1>"Hello"</H1>
</BODY>
</HTML>
""";
Helpful NullPointerException (Java 15)
17
• On rencontre fréquemment des exceptions de type NPE
• Hormis la stacktrace, pas d’informations utiles
• JVM réalise une analyse du byte-code
pour fournir un message d’erreur utile sur une NPE (conséquence, cause)
d’autant plus précis avec info de débogage (-g du compilateur)
• Le message fourni est contextuel
C:java>javac -g TestNPE.java
C:java>java TestNPE
Exception in thread "main" java.lang.NullPointerException: Cannot invoke
"String.toUpperCase()" because "message" is null
at TestNPE.main(TestNPE.java:5)
Pattern matching pour instanceof (Java 16)
18
• Pour simplifier le code
• Utilisation de l’opérateur &&
if (obj instanceof Groupe) {
Groupe groupe = (Groupe) obj;
var membres = groupe.membres();
}
if (obj instanceof Groupe groupe) {
var membres = groupe.membres();
}
if (obj instanceof Groupe groupe && !groupe.membres().isEmpty()) {
System.out.println(groupe.membres());
}
Les records(Java 16)
19
• Un nouveau type pour définir une classe
• Encapsulant des données de manière immuable
• Avec une syntaxe concise
utilisant l’identifiant restreint record
• Un record peut être personnalisé
avec un constructeur compact
public record Formation(String titre, String code, Duration duree) {
}
public record Formation(String titre, String code, Duration duree) {
public Formation {
if (titre.isBlank()) {
throw new IllegalArgumentException("Le titre doit être renseigné");
}
}
}
Les records(Java 16)
20
• Possibilité de définir et utiliser des records locaux
implicitement static
• Mais aussi des interfaces et énumérations locales (Java 15)
• Les records sont immuables au sens Java
• Les records sont « vraiment » immuables
il n’est pas possible de modifier la valeur/référence d’un composant
même en utilisant l’API Reflection ou VarHandle
• La désérialisation d’un record est différente
elle invoque le constructeur cannonique
Les classes scellées (Java 17)
21
• Fonctionnalité standard pour restreindre par déclaration
les classes qui peuvent étendre une classe scellée
les classes qui peuvent implémenter une interface scellée
• But : connaître de manière exhaustive les sous-types
• 3 nouveaux mots-clés contextuels : sealed, non-sealed et permits
• Les classes filles doivent avoir un des modificateurs
final, sealed ou non-sealed
• 2 contraintes sur l’endroit où pourront être les classes filles
dans un module nommé : dans le même module que leur classe mère
dans un unnamed module : dans le même package que leur classe mère
public sealed class Forme permits Cercle, Triangle {}
Java 17
22
• Diffusée en septembre 2021
• Nouvelle version majeure car LTS
• Le Security Manager est déprécié forRemoval
• Oracle diffuse son JDK sous licence NFTC
No-Fee Terms and Conditions
• Réduction de la durée entre 2 LTS à 2 ans
Java 18
23
• Diffusée en mars 2022
• UTF-8 par défaut (sauf sortie console)
• Le mécanisme finalize est déprécié
• Les extraits de code dans la Javadoc avec @snippet
• Un serveur web minimaliste
• Des améliorations dans les ramasse-miettes et la sécurité
Bilan de ses évolutions
24
• Souvent la verbosité est reprochée à Java
• Java se modernise et se simplifie
• Les évolutions présentées ne sont que les principales
• Il y en a beaucoup d’autres :
Collector teeing (Java 12)
jpackage (java 16)
hidden class (Java 15)
default et dynamic CDS archive (Java 12 et 13)
Stream::toList() (Java 16)
java.text.CompactNumberFormat (Java 12)
…
Le présent
Migration
25
Le plus dur reste à faire
26
• Maintenant que vous être convaincus
• Le plus dur reste à faire
• Convaincre l’exploitation
• Pour migrer vers une LTS plus récente : Java 11 ou 17
• Et donc budgéter et planifier cette migration
… et le management
Migration
Convaincre l’exploitation
27
Utiliser les évolutions vues
28
• Pour nous dev, beaucoup de choses sympa
• dans la syntaxe
• dans les API
• Mais malheureusement peu recevables
d’un point de vue exploitation
• Surtout que pour de (bonnes) raisons, elle est conservatrice
Les arguments recevables
29
• Les devs focalisent beaucoup sur la syntaxe et les API
• Mais l’élément majeur de Java c’est la JVM
• La JVM évolue aussi notamment sur
• La performance
• Et la sécurité
• Deux préoccupations majeures de l’exploitation
Performance
30
• La JVM de chaque version LTS améliore les performances
de manière globale
dépend du type d’application et de son activité
• Les ramasse-miettes évoluent
tous, G1 par défaut sur JVM server (Java 9)
• Et de nouveaux sont ajoutés :
ZGC, Shenandoah, Epsilon GC
• Le JIT
• Des optimisations dans les implémentations des API
compact String (Java 9), …
• Ça fonctionne bien en Java 8 -> encore mieux en 11 ou 17
Sécurité
31
• Maj Root CA Certificates et algo faibles désactivés
• Support de TLS 1.3 (Java 11)
• Algo de cryptographie :
ChaCha20 et ChaCha20-Poly1305 (Java 11)
Edwards-Curve Digital Signature Algorithm (EdDSA) (Java 15)
• PKCS12 par défaut dans le keystore (Java 9)
• SHA-3 (Java 9)
• Support de TLS 1.0 et 1.1 retirés (Java 16)
• Filter Incoming Serialization Data (Java 9)
Context-Specific Deserialization Filters (Java 17)
Migration
Convaincre le management
32
Les coûts
33
• Très variables pour la migration selon l’état de l’application
surtout avec les tests
• De la version courante (8 / 11) et ciblée de Java (11 / 17)
• Les performances peuvent réduire les coûts d’exploitation
surtout dans le cloud
GCs qui restituent la mémoire inutilisée au système
compact Strings (économie de heap)
jlink pour des runtimes personnalisés
….
D’autres arguments
34
• Très difficile de recruter actuellement
• Encore plus sur des technologies obsolètes
• Migrer pour être sur un socle plus récent, peut faciliter
• Mais aussi pour limiter le turn over
• Car au final le coût est parfois supérieur à celui de la migration
• Et puis … la RGPD pour un aspect légal
Migration
Mise en œuvre
35
Règles générales de migration > 8
36
• Mettre à jour les outils
avec une version compatible avec la version de Java ciblée
• Mettre à jour les dépendances
avec une version compatible avec la version de Java ciblée
• Utiliser jdeps (sur app et toutes les dépendances) pour
une cartographie des dépendances
les API internes utilisées
détecter les splits packages
• Utiliser CI/CD pour migrer à chaque nouvelle version de Java
• Mythe urbain : aucune obligation de modulariser l’application
migrer en laissant tout dans le classpath
modulariser si possible
Des API retirées
37
• A partir de Java 11, toutes les versions de Java retirent des API
• Celles marquées dans la ou les versions précédentes avec
• Consultez les listes de différences entres versions de Java
https://javaalmanac.io/
https://foojay.io/almanac/java-17/
• Utilisez jdeprscan pour obtenir les API dépréciées du JDK
à utiliser sur tout le classpath et modulepath
@Deprecated(forRemoval=true)
Java 8 vers 11
38
• Régler les incompatibilités
les API retirées, …
• Ajouter en tant que dépendances les API retirées
JavaFX, API Java EE (JAX-B, JAX-WS, JTA, CORBA, …)
• Cohabitation classpath/modulepath
l’option --illegal-access par défaut à permit
les options pour assouplir les règles de JPMS
le Multi-Release JAR
• Différentes stratégies :
migration sans module (unnamed modules)
migration qu’avec des modules (named modules)
migration incrémentales (automatic modules)
Java 11 vers 17
39
• Plus simple que de Java 8 à 11
• Attention aux API retirées (celles forRemoval=true)
• Nashorn retiré (Java 15)
• Idéalement requiert un code coverage à 100%
à cause de l’encapsulation forte des API du JDK
Encapsulation forte des API internes du JDK
40
• Depuis Java 9, l’option --illegal-access
contrôle l’accès par introspection par les unnamed modules
par défaut à permit pour des raisons des compatibilités
affiche un warning à chaque premier accès
• Ne pas ignorer ces warnings
• Java 16 : --illegal-access dépréciée et deny par défaut
• Java 17 : --illegal-access est ignorée (JEP 403)
• L’option --add-opens de la JVM
• Impact potentiel à l’exécution d’une application
Java 8 vers 17
41
• Evitez le grand saut
• Migrer avec étapes, idéalement 2 minimum
• migrer de 8 à 11
• migrer de 11 à 17
• Avec un seul déploiement en production
pour réduire les coûts (notamment de tests)
• pour ne pas avoir tous les problèmes à gérer en même temps
• assurer un meilleur suivi de l’avancement
Le futur
42
Le futur de Java
43
• De nombreux projets sont en cours
certains partiellement livrés ou en cours de livraison
• Amber : évolutions syntaxiques (pattern matching, …)
• Panama : interactions JVM / natif
Vector API, Foreign function & Memory API, …
• Loom : threads légers (fibers, continuations, …)
• Valhalla : fonctionnalités avancées
value/primitive types, generic specialization
• Java 19 sera diffusée en septembre 2022
• Java 21, prochaine LTS, sera diffusée en septembre 2023
Pattern Matching pour switch (Preview Java 17)
44
• Utilisation de patterns dans les case
guarded pattern, parenthesized pattern
• Support de null dans les case
• Doit évoluer dans les futures versions de Java
déconstruction, deconstruction pattern (array et record), …
static void afficherCercle(Forme f) {
String message = switch (f) {
case Cercle c && (c.getAire() > 100) -> "Grand cercle";
case Cercle c -> "Petit cercle";
default -> "Pas un cercle";
};
System.out.println(message);
}
Le futur de Devoxx FR
45
• Les informations indiquées n’engagent que moi
• Avoir des sessions pour les 10 prochaines années
• Toujours aussi riches, aussi intéressantes et aussi fun
• Sur les 2 étages du palais des Congrès
• Mes souhaits :
Conclusion
46
Conclusion
47
• Java poursuit son évolution
• pour offrir de nouvelles fonctionnalités
• pour simplifier le code et augmenter la productivité des devs
• La plateforme poursuit aussi sa cure d’amaigrissement
avec des fonctionnalités retirées ou bientôt retirées
• Pour en profiter, il faut migrer
• pour améliorer les performances et la sécurité
Conclusion
48
• Devoxx France nous enrichit chaque année
depuis 10 ans
• Durant les 10 prochaines années
• RDV dans 10 ans, même jour, même heure
• En avril 2032, pour en faire le bilan
• Bonne continuation avec Java et
• GROS remerciements aux organisateurs
Merci / Thank you
49

Contenu connexe

Tendances

Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
Irfan Maulana
 
Load Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - SlidesLoad Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - Slides
Severalnines
 
Callbacks part1
Callbacks part1Callbacks part1
Callbacks part1
Alireza AkhavanPour
 
Docker networking Tutorial 101
Docker networking Tutorial 101Docker networking Tutorial 101
Docker networking Tutorial 101
LorisPack Project
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
Naphachara Rattanawilai
 
使用 Liquibase 發展資料庫結構
使用 Liquibase 發展資料庫結構使用 Liquibase 發展資料庫結構
使用 Liquibase 發展資料庫結構
Steven Wang
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
Javier Lafora Rey
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.js
TechMagic
 
VueJS: The Simple Revolution
VueJS: The Simple RevolutionVueJS: The Simple Revolution
VueJS: The Simple Revolution
Rafael Casuso Romate
 
Portainer.io Intro | Into The Box 2018
Portainer.io Intro | Into The Box 2018Portainer.io Intro | Into The Box 2018
Portainer.io Intro | Into The Box 2018
Dillon Slaughter
 
Learn how to use Harbor
Learn how to use HarborLearn how to use Harbor
Learn how to use Harbor
Steve Wong
 
Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
José Paumard
 
Jakarta EE 8 on JDK17
Jakarta EE 8 on JDK17Jakarta EE 8 on JDK17
Jakarta EE 8 on JDK17
Rudy De Busscher
 
Angular
AngularAngular
Angular
Mahmoud Nbet
 
Weblogic12 c installation guide
Weblogic12 c installation guideWeblogic12 c installation guide
Weblogic12 c installation guide
Chinni Rajavardhan Reddy
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control Patterns
J On The Beach
 
From Zero to Spring Boot Hero with GitHub Codespaces
From Zero to Spring Boot Hero with GitHub CodespacesFrom Zero to Spring Boot Hero with GitHub Codespaces
From Zero to Spring Boot Hero with GitHub Codespaces
VMware Tanzu
 
React redux-tutoriel-1
React redux-tutoriel-1React redux-tutoriel-1
React redux-tutoriel-1
Sem Koto
 
UDA-Instalación PC local_wls11_proveedores
UDA-Instalación PC local_wls11_proveedoresUDA-Instalación PC local_wls11_proveedores
UDA-Instalación PC local_wls11_proveedores
Ander Martinez
 
Understanding docker networking
Understanding docker networkingUnderstanding docker networking
Understanding docker networking
Lorenzo Fontana
 

Tendances (20)

Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
Sencha ExtJs Learning Part 1 - Layout And Container in Sencha ExtJs - By Irfa...
 
Load Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - SlidesLoad Balancing MySQL with HAProxy - Slides
Load Balancing MySQL with HAProxy - Slides
 
Callbacks part1
Callbacks part1Callbacks part1
Callbacks part1
 
Docker networking Tutorial 101
Docker networking Tutorial 101Docker networking Tutorial 101
Docker networking Tutorial 101
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
使用 Liquibase 發展資料庫結構
使用 Liquibase 發展資料庫結構使用 Liquibase 發展資料庫結構
使用 Liquibase 發展資料庫結構
 
An introduction to Vue.js
An introduction to Vue.jsAn introduction to Vue.js
An introduction to Vue.js
 
Intro to vue.js
Intro to vue.jsIntro to vue.js
Intro to vue.js
 
VueJS: The Simple Revolution
VueJS: The Simple RevolutionVueJS: The Simple Revolution
VueJS: The Simple Revolution
 
Portainer.io Intro | Into The Box 2018
Portainer.io Intro | Into The Box 2018Portainer.io Intro | Into The Box 2018
Portainer.io Intro | Into The Box 2018
 
Learn how to use Harbor
Learn how to use HarborLearn how to use Harbor
Learn how to use Harbor
 
Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19Loom Virtual Threads in the JDK 19
Loom Virtual Threads in the JDK 19
 
Jakarta EE 8 on JDK17
Jakarta EE 8 on JDK17Jakarta EE 8 on JDK17
Jakarta EE 8 on JDK17
 
Angular
AngularAngular
Angular
 
Weblogic12 c installation guide
Weblogic12 c installation guideWeblogic12 c installation guide
Weblogic12 c installation guide
 
Transactions and Concurrency Control Patterns
Transactions and Concurrency Control PatternsTransactions and Concurrency Control Patterns
Transactions and Concurrency Control Patterns
 
From Zero to Spring Boot Hero with GitHub Codespaces
From Zero to Spring Boot Hero with GitHub CodespacesFrom Zero to Spring Boot Hero with GitHub Codespaces
From Zero to Spring Boot Hero with GitHub Codespaces
 
React redux-tutoriel-1
React redux-tutoriel-1React redux-tutoriel-1
React redux-tutoriel-1
 
UDA-Instalación PC local_wls11_proveedores
UDA-Instalación PC local_wls11_proveedoresUDA-Instalación PC local_wls11_proveedores
UDA-Instalación PC local_wls11_proveedores
 
Understanding docker networking
Understanding docker networkingUnderstanding docker networking
Understanding docker networking
 

Similaire à devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf

Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Jean-Michel Doudoux
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10
Jean-Michel Doudoux
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
Mahamadou TOURE, Ph.D.
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
Jean-Michel Doudoux
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
Jean-Michel Doudoux
 
[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15
Romain Schlick
 
Javaoop
JavaoopJavaoop
Javaoop
javaexpert
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
Antoine Rey
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
Ombotimbe Salifou
 
Nantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenantNantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenant
Jean-Michel Doudoux
 
Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?
Jérôme Tamborini
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Loic Yon
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
Antoine Rey
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
Jérôme Tamborini
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
Jean-Michel Doudoux
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
sabrine_hamdi
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
Mohamed Lahby
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
Mohamed Ferchichi
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
Florian Beaufumé
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! frameworkHoracio Gonzalez
 

Similaire à devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf (20)

Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10Voxxeddays lux 2018 apres java 8, java 9 et 10
Voxxeddays lux 2018 apres java 8, java 9 et 10
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10Devoxx 2018 Après Java 8, Java 9 et 10
Devoxx 2018 Après Java 8, Java 9 et 10
 
Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018Apres java 8, java 9 et 10 - BreizhCamp 2018
Apres java 8, java 9 et 10 - BreizhCamp 2018
 
[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15
 
Javaoop
JavaoopJavaoop
Javaoop
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Nantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenantNantes jug 2018 - Java le changement c'est maintenant
Nantes jug 2018 - Java le changement c'est maintenant
 
Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Retours Devoxx France 2016
Retours Devoxx France 2016Retours Devoxx France 2016
Retours Devoxx France 2016
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017Java 9 modulo les modules devoxx fr 2017
Java 9 modulo les modules devoxx fr 2017
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Enib cours c.a.i. web - séance #5 : scala play! framework
Enib   cours c.a.i. web - séance #5 : scala play! frameworkEnib   cours c.a.i. web - séance #5 : scala play! framework
Enib cours c.a.i. web - séance #5 : scala play! framework
 

Plus de Jean-Michel Doudoux

Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdfLes nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdfLes nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 21 - YaJUG 2024.pdf
Les nouveautés de Java 21 - YaJUG 2024.pdfLes nouveautés de Java 21 - YaJUG 2024.pdf
Les nouveautés de Java 21 - YaJUG 2024.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 21 - Devoxx France 2024.pdf
Les nouveautés de Java 21 - Devoxx France 2024.pdfLes nouveautés de Java 21 - Devoxx France 2024.pdf
Les nouveautés de Java 21 - Devoxx France 2024.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdfLes nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Jean-Michel Doudoux
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Jean-Michel Doudoux
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
Jean-Michel Doudoux
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Jean-Michel Doudoux
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Jean-Michel Doudoux
 
Lyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenantLyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenant
Jean-Michel Doudoux
 
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMXAnniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
Jean-Michel Doudoux
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
Jean-Michel Doudoux
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
Jean-Michel Doudoux
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
Jean-Michel Doudoux
 

Plus de Jean-Michel Doudoux (16)

Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdfLes nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
Les nouveautés de Java 22 - Lorraine JUG avril 2024.pdf
 
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdfLes nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
Les nouveautés de Java 22 - Oracle Dev Day mai 2024.pdf
 
Les nouveautés de Java 21 - YaJUG 2024.pdf
Les nouveautés de Java 21 - YaJUG 2024.pdfLes nouveautés de Java 21 - YaJUG 2024.pdf
Les nouveautés de Java 21 - YaJUG 2024.pdf
 
Les nouveautés de Java 21 - Devoxx France 2024.pdf
Les nouveautés de Java 21 - Devoxx France 2024.pdfLes nouveautés de Java 21 - Devoxx France 2024.pdf
Les nouveautés de Java 21 - Devoxx France 2024.pdf
 
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdfLes nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
Les nouveautés de Java 21 - Lorraing JUG mars 2024.pdf
 
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
 
Lyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenantLyon JUG 2018 - Java le changement c'est maintenant
Lyon JUG 2018 - Java le changement c'est maintenant
 
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMXAnniversaire Paris JUG -  Deja 10 ans - retour vers le futur avec JMX
Anniversaire Paris JUG - Deja 10 ans - retour vers le futur avec JMX
 
Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8Voxxdays luxembourg 2016 retours java 8
Voxxdays luxembourg 2016 retours java 8
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 

devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf

  • 1. #DevoxxFR 10 ans de Devoxx FR et de Java Jean-Michel Doudoux @jmdoudoux 1
  • 2. Il y a 10 ans 2 • Présent à la keynote de Stephan Janssen à Devoxx Anvers Annonce à la fin via une vidéo • https://www.youtube.com/watch?v=CbjZBf-IWek • A l'hôtel Marriott rive gauche • Devoxx France
  • 4. Java a évolué sur la décade 4 • Avec pas moins de 10 versions publiées grâce au nouveau modèle de releases • Avec un accueil partagé/mitigé selon les versions qui sont passés par différentes couleurs de l’arc en ciel • Trois versions LTS Java 10,12, 13, 14, 15, 16 : transparence Java 8 : fort engouement Java 11 : adoption (très) lente Java 17 : bonheur des devs • Sept versions non-LTS Java 9 : a cassé l’engouement
  • 5. Jean-Michel DOUDOUX 5 http://www.jmdoudoux.fr @jmdoudoux Co-fondateur du Auteur de 2 didacticiels Diffusés sous licence GNU FDL • Développons en Java (3600 pages) • Développons en Java avec Eclipse CTO et
  • 6. Roadmap 6 • Le présent • La migration vers Java 11 et 17 • Convaincre l’exploitation • Le futur • Le passé • 10 ans d’évolutions de Java • Convaincre le management • Mettre en œuvre la migration
  • 8. 2012 8 • La version courante est Java 7 (juillet 2011) • NIO 2 Path, Files, Glob, WatchService, DirectoryStream, walkFileTree() … • Des APIs requises pour Java 8 : fork/join, invoke dynamic • Le projet Coins try with resources, exceptions multiples dans catch, opérateur diamant, String dans switch, underscore dans les littéraux numériques long valeur = 10_000_000_000L; long valeur = 1_0_0_0_0_0_0_0_0_0_0L;
  • 9. Java 8 9 • Sortie en mars 2014 • Les expressions Lambda et les références de méthode • Une approche fonctionnelle du traitement de données avec l’API Stream • L’API Date & Time • Redonne un fort engouement pour Java • Les méthodes par défaut et static dans les interfaces • Les classes Optional • Les annotations répétées
  • 10. Java 9 : syntaxe 10 • Evolutions mineures dans le langage @SafeVarags sur des méthodes privées l’opérateur diamant sur les classes anonymes try with resources : utilisation directe de variables explicitement final le caractère _ (underscore) est un mot clé réservé les méthodes privées dans les interfaces // Java 7 et 8 public void lire(FileInputStream fis) { try(FileInputStream fisr = fis) { // ... } // Java 9 public void lire(FileInputStream fis) { try(fis) { // ... } • Sortie en septembre 2017
  • 11. Java 9 : API / Outils 11 • JShell : outil de type REPL tester une portion de code ou expérimenter une API • API Process interface ProcessHandle • Fabriques statiques pour collections immuables • Stackwalking API • Flow API (Reactive Streams) • VarHandle opérations atomiques/ordonnées via une référence typée à une variable List<String> lettres = List.of("a", "b", "c", "d");
  • 12. Java 9 : les modules 12 • Les principaux objectifs proposent d’améliorer : la fiabilité de la configuration (reliable configuration) la sécurité avec l’encapsulation forte (strong encapsulation) la performance la maintenabilité • La fonctionnalité la plus impactante … et la plus controversée • La mise en œuvre implique des contraintes ruptures (visibilité, accessibilité, organisation du code, …) • Solutions pour faire cohabiter monde modulaire et non modulaire • Rendre modulaire une application n’est pas obligatoire • Création de JRE personnalisés via l’outil jlink
  • 13. L’instruction var (Java 10) 13 • Pour faciliter la définition de variables var salutation = "Bonjour"; var bonneChancePourNommerCetteVariable = personnes.stream().collect(...))))))); var service = new Object() { void afficher() {} void calculer() {} }; service.calculer(); service.afficher(); • Le type inféré est parfois surprenant var liste = List.of("test",1); List<Serializable & Comparable<? extends Serializable & Comparable<?>>> En Java 11 List<Serializable & Comparable<? extends Serializable & Comparable<?> & java.lang.constant.Constable & java.lang.constant.ConstantDesc> & java.lang.constant.Constable & java.lang.constant.ConstantDesc> En Java 17 • Nouvelles opportunités avec les classes anonymes Map<Integer, Map<String, Map<String, Map<Integer, List<Personne>>>>> bonneChancePourNommerCetteVariable = personnes.stream.collect(...))))))); var var = personnes.stream().collect(...)))))));
  • 14. Java 11 14 • Diffusée en septembre 2018 • Version importante car LTS • Exécution directe d’un unique fichier .java par la JVM sans compilation préalable • API HTTP Client support HTTP 1.1 et 2, websockets, synchrone/asynchrone • JDK Flight Recorder
  • 15. Switch expressions(Java 14) 15 switch (niveau) { case 1, 2 -> { System.out.print("Débutant"); System.out.println(" et junior"); } case 3, 4 -> System.out.println("Confirmé"); case 5 -> System.out.println("Expert"); } String libelle = switch (niveau) { case 1, 2 -> "Débutant"; case 3, 4 -> "Confirmé"; case 5 -> "Expert"; default -> { System.out.println("cas par défaut"); yield "Non défini"; } }; System.out.println(libelle); String libelle = switch (niveau) { case 1, 2 : yield "Débutant"; case 3, 4 : yield "Confirmé"; case 5 : yield "Expert"; default : { System.out.println("cas par défaut"); yield "Non défini"; } }; System.out.println(libelle); switch (niveau) { case 1, 2 : System.out.print("Débutant"); System.out.println(" et junior"); break; case 3, 4 : System.out.println("Confirmé"); break; case 5 : System.out.println("Expert"); break; }
  • 16. Blocs de texte(Java 15) 16 • Exprimer une chaîne de caractères littérale multiligne simplement : basiquement sans séquence d’échappement • Gestion de l’indentation accessoire/significative en début et fin en déplaçant le contenu vers la droite en déplaçant le délimiteur de fermeture vers la gauche • 2 nouveaux caractères d’échappement s pour indiquer un espace <retour_chariot> supprime la fin de ligne String html = """ <HTML> <BODY> <H1>"Hello"</H1> </BODY> </HTML>"""; String html = """ <HTML> <BODY> <H1>"Hello"</H1> </BODY> </HTML>"""; String html = """ <HTML> <BODY> <H1>"Hello"</H1> </BODY> </HTML> """;
  • 17. Helpful NullPointerException (Java 15) 17 • On rencontre fréquemment des exceptions de type NPE • Hormis la stacktrace, pas d’informations utiles • JVM réalise une analyse du byte-code pour fournir un message d’erreur utile sur une NPE (conséquence, cause) d’autant plus précis avec info de débogage (-g du compilateur) • Le message fourni est contextuel C:java>javac -g TestNPE.java C:java>java TestNPE Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.toUpperCase()" because "message" is null at TestNPE.main(TestNPE.java:5)
  • 18. Pattern matching pour instanceof (Java 16) 18 • Pour simplifier le code • Utilisation de l’opérateur && if (obj instanceof Groupe) { Groupe groupe = (Groupe) obj; var membres = groupe.membres(); } if (obj instanceof Groupe groupe) { var membres = groupe.membres(); } if (obj instanceof Groupe groupe && !groupe.membres().isEmpty()) { System.out.println(groupe.membres()); }
  • 19. Les records(Java 16) 19 • Un nouveau type pour définir une classe • Encapsulant des données de manière immuable • Avec une syntaxe concise utilisant l’identifiant restreint record • Un record peut être personnalisé avec un constructeur compact public record Formation(String titre, String code, Duration duree) { } public record Formation(String titre, String code, Duration duree) { public Formation { if (titre.isBlank()) { throw new IllegalArgumentException("Le titre doit être renseigné"); } } }
  • 20. Les records(Java 16) 20 • Possibilité de définir et utiliser des records locaux implicitement static • Mais aussi des interfaces et énumérations locales (Java 15) • Les records sont immuables au sens Java • Les records sont « vraiment » immuables il n’est pas possible de modifier la valeur/référence d’un composant même en utilisant l’API Reflection ou VarHandle • La désérialisation d’un record est différente elle invoque le constructeur cannonique
  • 21. Les classes scellées (Java 17) 21 • Fonctionnalité standard pour restreindre par déclaration les classes qui peuvent étendre une classe scellée les classes qui peuvent implémenter une interface scellée • But : connaître de manière exhaustive les sous-types • 3 nouveaux mots-clés contextuels : sealed, non-sealed et permits • Les classes filles doivent avoir un des modificateurs final, sealed ou non-sealed • 2 contraintes sur l’endroit où pourront être les classes filles dans un module nommé : dans le même module que leur classe mère dans un unnamed module : dans le même package que leur classe mère public sealed class Forme permits Cercle, Triangle {}
  • 22. Java 17 22 • Diffusée en septembre 2021 • Nouvelle version majeure car LTS • Le Security Manager est déprécié forRemoval • Oracle diffuse son JDK sous licence NFTC No-Fee Terms and Conditions • Réduction de la durée entre 2 LTS à 2 ans
  • 23. Java 18 23 • Diffusée en mars 2022 • UTF-8 par défaut (sauf sortie console) • Le mécanisme finalize est déprécié • Les extraits de code dans la Javadoc avec @snippet • Un serveur web minimaliste • Des améliorations dans les ramasse-miettes et la sécurité
  • 24. Bilan de ses évolutions 24 • Souvent la verbosité est reprochée à Java • Java se modernise et se simplifie • Les évolutions présentées ne sont que les principales • Il y en a beaucoup d’autres : Collector teeing (Java 12) jpackage (java 16) hidden class (Java 15) default et dynamic CDS archive (Java 12 et 13) Stream::toList() (Java 16) java.text.CompactNumberFormat (Java 12) …
  • 26. Le plus dur reste à faire 26 • Maintenant que vous être convaincus • Le plus dur reste à faire • Convaincre l’exploitation • Pour migrer vers une LTS plus récente : Java 11 ou 17 • Et donc budgéter et planifier cette migration … et le management
  • 28. Utiliser les évolutions vues 28 • Pour nous dev, beaucoup de choses sympa • dans la syntaxe • dans les API • Mais malheureusement peu recevables d’un point de vue exploitation • Surtout que pour de (bonnes) raisons, elle est conservatrice
  • 29. Les arguments recevables 29 • Les devs focalisent beaucoup sur la syntaxe et les API • Mais l’élément majeur de Java c’est la JVM • La JVM évolue aussi notamment sur • La performance • Et la sécurité • Deux préoccupations majeures de l’exploitation
  • 30. Performance 30 • La JVM de chaque version LTS améliore les performances de manière globale dépend du type d’application et de son activité • Les ramasse-miettes évoluent tous, G1 par défaut sur JVM server (Java 9) • Et de nouveaux sont ajoutés : ZGC, Shenandoah, Epsilon GC • Le JIT • Des optimisations dans les implémentations des API compact String (Java 9), … • Ça fonctionne bien en Java 8 -> encore mieux en 11 ou 17
  • 31. Sécurité 31 • Maj Root CA Certificates et algo faibles désactivés • Support de TLS 1.3 (Java 11) • Algo de cryptographie : ChaCha20 et ChaCha20-Poly1305 (Java 11) Edwards-Curve Digital Signature Algorithm (EdDSA) (Java 15) • PKCS12 par défaut dans le keystore (Java 9) • SHA-3 (Java 9) • Support de TLS 1.0 et 1.1 retirés (Java 16) • Filter Incoming Serialization Data (Java 9) Context-Specific Deserialization Filters (Java 17)
  • 33. Les coûts 33 • Très variables pour la migration selon l’état de l’application surtout avec les tests • De la version courante (8 / 11) et ciblée de Java (11 / 17) • Les performances peuvent réduire les coûts d’exploitation surtout dans le cloud GCs qui restituent la mémoire inutilisée au système compact Strings (économie de heap) jlink pour des runtimes personnalisés ….
  • 34. D’autres arguments 34 • Très difficile de recruter actuellement • Encore plus sur des technologies obsolètes • Migrer pour être sur un socle plus récent, peut faciliter • Mais aussi pour limiter le turn over • Car au final le coût est parfois supérieur à celui de la migration • Et puis … la RGPD pour un aspect légal
  • 36. Règles générales de migration > 8 36 • Mettre à jour les outils avec une version compatible avec la version de Java ciblée • Mettre à jour les dépendances avec une version compatible avec la version de Java ciblée • Utiliser jdeps (sur app et toutes les dépendances) pour une cartographie des dépendances les API internes utilisées détecter les splits packages • Utiliser CI/CD pour migrer à chaque nouvelle version de Java • Mythe urbain : aucune obligation de modulariser l’application migrer en laissant tout dans le classpath modulariser si possible
  • 37. Des API retirées 37 • A partir de Java 11, toutes les versions de Java retirent des API • Celles marquées dans la ou les versions précédentes avec • Consultez les listes de différences entres versions de Java https://javaalmanac.io/ https://foojay.io/almanac/java-17/ • Utilisez jdeprscan pour obtenir les API dépréciées du JDK à utiliser sur tout le classpath et modulepath @Deprecated(forRemoval=true)
  • 38. Java 8 vers 11 38 • Régler les incompatibilités les API retirées, … • Ajouter en tant que dépendances les API retirées JavaFX, API Java EE (JAX-B, JAX-WS, JTA, CORBA, …) • Cohabitation classpath/modulepath l’option --illegal-access par défaut à permit les options pour assouplir les règles de JPMS le Multi-Release JAR • Différentes stratégies : migration sans module (unnamed modules) migration qu’avec des modules (named modules) migration incrémentales (automatic modules)
  • 39. Java 11 vers 17 39 • Plus simple que de Java 8 à 11 • Attention aux API retirées (celles forRemoval=true) • Nashorn retiré (Java 15) • Idéalement requiert un code coverage à 100% à cause de l’encapsulation forte des API du JDK
  • 40. Encapsulation forte des API internes du JDK 40 • Depuis Java 9, l’option --illegal-access contrôle l’accès par introspection par les unnamed modules par défaut à permit pour des raisons des compatibilités affiche un warning à chaque premier accès • Ne pas ignorer ces warnings • Java 16 : --illegal-access dépréciée et deny par défaut • Java 17 : --illegal-access est ignorée (JEP 403) • L’option --add-opens de la JVM • Impact potentiel à l’exécution d’une application
  • 41. Java 8 vers 17 41 • Evitez le grand saut • Migrer avec étapes, idéalement 2 minimum • migrer de 8 à 11 • migrer de 11 à 17 • Avec un seul déploiement en production pour réduire les coûts (notamment de tests) • pour ne pas avoir tous les problèmes à gérer en même temps • assurer un meilleur suivi de l’avancement
  • 43. Le futur de Java 43 • De nombreux projets sont en cours certains partiellement livrés ou en cours de livraison • Amber : évolutions syntaxiques (pattern matching, …) • Panama : interactions JVM / natif Vector API, Foreign function & Memory API, … • Loom : threads légers (fibers, continuations, …) • Valhalla : fonctionnalités avancées value/primitive types, generic specialization • Java 19 sera diffusée en septembre 2022 • Java 21, prochaine LTS, sera diffusée en septembre 2023
  • 44. Pattern Matching pour switch (Preview Java 17) 44 • Utilisation de patterns dans les case guarded pattern, parenthesized pattern • Support de null dans les case • Doit évoluer dans les futures versions de Java déconstruction, deconstruction pattern (array et record), … static void afficherCercle(Forme f) { String message = switch (f) { case Cercle c && (c.getAire() > 100) -> "Grand cercle"; case Cercle c -> "Petit cercle"; default -> "Pas un cercle"; }; System.out.println(message); }
  • 45. Le futur de Devoxx FR 45 • Les informations indiquées n’engagent que moi • Avoir des sessions pour les 10 prochaines années • Toujours aussi riches, aussi intéressantes et aussi fun • Sur les 2 étages du palais des Congrès • Mes souhaits :
  • 47. Conclusion 47 • Java poursuit son évolution • pour offrir de nouvelles fonctionnalités • pour simplifier le code et augmenter la productivité des devs • La plateforme poursuit aussi sa cure d’amaigrissement avec des fonctionnalités retirées ou bientôt retirées • Pour en profiter, il faut migrer • pour améliorer les performances et la sécurité
  • 48. Conclusion 48 • Devoxx France nous enrichit chaque année depuis 10 ans • Durant les 10 prochaines années • RDV dans 10 ans, même jour, même heure • En avril 2032, pour en faire le bilan • Bonne continuation avec Java et • GROS remerciements aux organisateurs
  • 49. Merci / Thank you 49