Première conférence organisée par le JAVA WAVE. Jean-François Savard, programmeur senior chez Effenti nous fait part des nouveautés entourant le JAVA 9.
13. 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
- But de la présentation : Survol des nouveautés principales dans Java9
- Impossible de tout condenser en une présentation d’1h
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
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
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
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
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
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
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
Pas de panique, on peut ramener les modules à l'aide d'un flag --add-modules
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
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
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).
Voici un bref aperçu d’un output généré par Jdeps sur un module de glassfish
Il y en a pas mal plus, mais on va voir quelques méthodes ajoutés au JDK fun à utiliser.
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.
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>
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.
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.
À 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.
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
Bon à savoir si vous utilisé la version dans une comparaison quelque part.
- 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
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”
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
Avant la modularisation, on voit tout de suite qu'il y a un problème
Après la modularisation, pour info ces graphiques peuvent être générés avec netbeans.
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