Quoi d’9 Java9 ?
Présenté par Jean-François Savard
Novembre 2016
Nouveautés
Informations générales
- Date prévu pour le 27 Juillet 2017
- Accès prématuré : https://jdk9.java.net/
- Accès prématuré avec Jigsaw : https://jdk9.java.net/jigsaw
- Code source : http://hg.openjdk.java.net/jdk9/dev/
- Mailing list : http://mail.openjdk.java.net/mailman/listinfo/jdk9-dev
- Informations : http://openjdk.java.net/projects/jdk9/
Horaire
• Quelques changements
• Présentation d’outils
• Les bonbons
• Nouveautés du langages
• Jigsaw
• Questions
Changements à considérer
5
Mise en contexte: survol des APIs
• Les standards JCP
• Les APIs spécifique au JDK
• Les APIs non-supportés
6
JEP-260: Encapsulation d’APIs interne
• APIs interne non-critique
• APIs interne critique
• APIs interne critique sans alternative
• Pas de panique!
7
Restructuration du JDK
8
JDK 8: JDK 9:
Méthodes @Deprecated enlevés
• java.util.logging.LogManager::addPropertyChangeListener
• java.util.logging.LogManager::removePropertyChangeListener
• java.util.jar.Pack200.Packer::addPropertyChangeListener
• java.util.jar.Pack200.Packer::removePropertyChangeListener
• java.util.jar.Pack200.Unpacker::addPropertyChangeListener
• java.util.jar.Pack200.Unpacker::removePropertyChangeListener
9
Modules partagés avec JavaEE non
résolu par défaut
• java.corba
• java.transaction
• java.annotations.common
• java.activation
• java.xml.ws (JAX-WS)
• java.xml.bind (JAXB)
10
Présentation d’outils
11
JShell
• Enfin un REPL pour Java!
• Buts visés
• P’tite démo!
12
JavaDoc
• Support du HTML5
• Possibilité de recherche
• HTML4 par défaut
• P’tite démo!
Pour plus d’informations : http://openjdk.java.net/jeps/224
13
jdeps
• Vérifier l’usage d’API internes
• Amélioré dans Java9
• Utilisation très simple
14
jdeps
15
Les bonbons
16
Instanciation de collections
17
Collectors.flatMapping
18
Collectors.filtering
19
Optional.ifPresentOrElse
20
Objects.requireNonNullElse
21
Présentation des nouveautés
du langage
22
@SafeVargs
• Anciennes spécifications :
• Nouvelles spécifications :
23
try-with-resources
24
Retaille des diamants
• Types non-denotable
• Diamond operator dans les classes anonymes
• Changement au niveau de la JVM
25
Enlever _ des identifiants légals
26
• Java8
• Java9
• Futures possibilités
• Partial diamond
• « Don’t care » parameter
Méthodes privées dans les interfaces
• Oublié dans Java8
• Allège le code des interfaces
• Déjà implémenté au niveau de la JVM
27
Amélioration de @Deprecated
28
jdeprscan
29
Strings
• Changements à l’interne
• Meilleur gestion de la mémoire
• StringConcatFactory
30
Nouveau scheme de version
• Le « 1. » dans « 1.9 » disparait.
31
Refonte de l’inférence de type
32
Bref aperçu de la
programmation modulaire
33
Pourquoi la modularité?
• Petits appareils
• Sécurité
• Performance
• Maintenance
34
JDK avant
35
JDK après
36
Qu’est-ce qu’un module?
• Module = package
• module-info.java
• requires
• exports
• requires transitive
• Mot-clé : « read »
• public != accessible
module-info.java
38
jlink
• Demo!
39
Quoi d'9, JAVA 9 ?

Quoi d'9, JAVA 9 ?

Notes de l'éditeur

  • #2 - But de la présentation : Survol des nouveautés principales dans Java9 - Impossible de tout condenser en une présentation d’1h
  • #3 C’est normal que vous n’arrivez pas à lire, on perdrait trop de temps anyway But de cette slide est simplement de faire réaliser qu’il y a beaucoup de choses Cette liste représente tous les JEPs inclus dans Java9, la liste peut être trouvé sur la page jdk9 d’openjdk
  • #4 Date prévu le 27 juillet Accès prématuré aux builds avec ou sans jigsaw Code source peut être récupéré d’OpenJDK Possibilité de s’abonner au mailing list pour être à l’affut de toutes discussions Pour toutes autres informations (JEPs) voir la page jdk9 d’openjdk Le powerpoint sera uploadé sur le site du Java Wave donc ces liens pourront être récupérés
  • #5 Quelques changements dont il faut être à l’affut avant de migrer Présentation d’outils Présentation de bonbons du JDK, donc de nouvelles méthodes ajoutés le fun Nouveautés du langages Un très bref aperçu de Jigsaw, le but n’est pas de rentrer en détail, mais bien de vous teaser pour la prochaine conférence qui portera entièrement sur jigsaw. Questions
  • #7 Le JDK est décomposé en plusieurs APIs Les standards JCP (Java Community Process), on parle de java.* et javax.* Les APIs spécifique au JDK, on parle de com.sun.* et quelques occurrences de jdk.* Les APIs non-supportés et interne, on parle de sun.* principalement. Jamais été prévu pour le public. Deux catégories Non-critique : Ceux qui ne sont probablement pas utilisé en dehors du JDK car il n’y aurait aucune raison. Ex. sun.misc.BASE64Decoder… Plein de librairies l’offre déjà Critique : Fonctionnalités qui serait difficile à implémenter en dehors du JDK et qui sont donc utilisés beaucoup par le public. Ex. sun.misc.Unsafe
  • #8 Le but de ce JEP est de rendre la majorité des APIs internes innaccessible à l’exception de celles grandement utilisés (APIs critiqu) Les APIs internes non-critique seront encapsulés par défaut Les APIS internes critiques qui ont une alternative connu depuis 8 seront aussi encapsulés Ne pas encapsuler les APIs internes critiques qui n’ont pas d’alternatives prévu dans 8, parcontre si elles ont une alternative dans 9, on les met @Deprecated et on les enlèves dans 10 APIs internes critiques qui vont rester accessible dans JDK 9: sun.misc.{Signal,SignalHandler} sun.misc.Unsafe (JEP-193) sun.reflect.Reflection sun.reflect.ReflectionFactory
  • #9 Le dossier JRE est supprimé Plus de rt.jar et tools.jar Rt.jar regroupe toutes les .class nécessaire au runtime Tools.jar contient tous les outils requis par le JDK, mais pas par le JRE… exemple javac, javadoc Ceux dans bin ne faisaient que référer ce qu’il y a dans tools.jar
  • #10 Enfin des méthodes @Deprecated enlevés. Il y a peu de chances que vous utilisez une de ces méthodes, mais si c'est le cas sachez qu'elles n'existeront plus dans Java9
  • #11 Pas de panique, on peut ramener les modules à l'aide d'un flag --add-modules
  • #13 Buts visés : Faciliter l’apprentissage, facilite l’exploration d’APIs et de nouvelles fonctionnalités cd %JDK9_BIN% Jshell - Pas besoin de ; etc On peut créer des variables -> « foo bar baz » On peut lister des variables avec /vars On peut accéder à une variable avec $ On peut créer une méthode void sayHello() {} On peut voir les méthodes créées avec /methods On peut créer une classe class Test {} On peut lister les classes avec /types On peut modifier un snippet avec /edit On peut changer l’editeur /set editor notepad Les imports sont résolu par défaut i.e si j’écris Pattern.compile(« \\s »).splitAsStream($1).forEach(System.out::println) et que je type /imports on voit java.util.regex On peut voir l’historique de la session avec /history On peut enregistrer dans un fichier avec /save On peut charger un fichier avec /open On peut réinitialiser le jshell avec /jshell On peut lister tout ce qui a été créé avec /list On peut supprimer un snippet avec /drop Jshell builtin dans netbeans
  • #14 Actuellement la javadoc génère du HTML4. Le nouvel outil supportera HTML5 donc il sera possible de fermer les balises <p>. HTML4 restera généré par défaut, mais on pourra choisir html5 en spécifiant –html5 Enfin l’ajout d’une fonctionnalité de recherche. https://docs.oracle.com/javase/8/docs/api/ https://download.java.net/java/jdk9/docs/api/index.html Faire une demo pour montrer l’outil de recherche versus avant Outil de recherche côté client en javascript Possibilité de créer des index Pour plus d’informations voir le JEP-224
  • #15 Certains d’entre vous connaissent peut-être l’outil, il existait déjà, mais a été amélioré dans Java 9 pour les modules. - Permet de vérifier l’usage de librairies internes --jdkinternal - Permet plusieurs options de filtres (par regex, modules, etc).
  • #16 Voici un bref aperçu d’un output généré par Jdeps sur un module de glassfish
  • #17 Il y en a pas mal plus, mais on va voir quelques méthodes ajoutés au JDK fun à utiliser.
  • #18 Pour des raisons de perf, les implémentations sont faites sur plusieurs overload (10 si je me souviens bien) Donc à prévoir que dans eclipse si on fait ctrl+espace, on risque de voir 10 méthodes aparaitre avec 10 paramètres.
  • #19 Principalement utile lorsqu’on a une réduction sur plusieurs niveaux, exemple comme « downStream » d’un groupingBy Dans le premier exemple, il y aurait eu possibilité d’utiliser Collectors.reducing, mais on brise le contrat et en bonus cet exemple fonctionne avec parralelStream On a une liste d’orders qu’on veut grouper par customerName .. Problème List<List<LineItems>> alors qu’on veut List<LineItems>
  • #21 En gros ce qu’on fait ici dans java8, On map notre valeur si elle est présente en un Runnable qui exécute une action, sinon on map dans un autre Runnable qui fait le fallback. On call run à la fin. Ça semble overkill un peu pour le but initial. Java9 nous arrive avec un ifPresentOrElse qui rend la chose beaucoup plus clean, on passe l’action si présent, sinon un autre Runnable.
  • #22 Deux nouvelles méthodes de pré-conditions ajoutés qui permettent déviter les if(null) assign… requireNonNullElse prend la valeur par défaut, tandis que requireNonNullElseGet prend un supplier pour généré une valeur par défaut.
  • #26 À l’interne, le compilateur opère sur plusieurs « types » qui ne peuvent être utilisé directement dans un fichier java. Ces types sont « non-denotable ». Java9 permet la création de classes anonymes avec <>, (changement au niveau de la JVM). JDK7: Suppression d’environs 90% des types explicites. JDK9: Supression du 10% restant.
  • #31 Le tableau interne char[] n’est plus! 1-2 byte(s) par caractère Transparent pour l’usager, seulement une meilleur gestion de la mémoire. JEP-280: la concaténation par défaut n’utilise plus de StringBuilder. StringConcatFactory Optimisé par la JVM
  • #32 Bon à savoir si vous utilisé la version dans une comparaison quelque part.
  • #33 - L’inférence de type est utilisé par javac pour compiler les <> - Problème de performance lorsqu’on les encapsule - Ouvre la porte à d’autres optimisations dans le futur
  • #34 Vraiment juste un teaser, on rentre pas en détails Prochaine présentation Plusieurs mots-clé Notions de modularité Modules et Services “Under the Hood”
  • #35 Rendre le JDK plus facilement accessible aux petits appareils. Améliorer la sécurité et la maintenance du JDK. Meilleur performance. Plus facile de construire des librairies et/ou grosses applications. Ces buts peuvent être retrouvés sur la page du projet JigSaw sur openjdk
  • #36 Avant la modularisation, on voit tout de suite qu'il y a un problème
  • #37 Après la modularisation, pour info ces graphiques peuvent être générés avec netbeans.
  • #38 Un module peut être vu comme un package Chaque module est défini par un fichier module-info.java On spécifie les modules voulu à l’aide du mot-clé requires On spécifie dans un module ce qu’on veut rendre accessible à l’aide du mot-clé exports On peut spécifier de trainer un module dans toute la hiérarchie à l’aide du mot-clé transitive Lorsqu’un module requiert un autre module, on dit que A « reads » B public != accessible
  • #40 Jlink –module-path /jmods –add-module java.base –output myimg –strip-debug –output myimg