{"id":1375,"date":"2022-01-04T12:46:41","date_gmt":"2022-01-04T11:46:41","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1375"},"modified":"2022-03-25T12:33:01","modified_gmt":"2022-03-25T11:33:01","slug":"java-18-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-18-quoi-de-neuf\/","title":{"rendered":"Java 18 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 18 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs.<\/p>\n<p>Cet article fait partie d\u2019une suite d\u2019article sur les <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/tag\/whatsnew\/\">nouveaut\u00e9s des derni\u00e8res versions de Java<\/a>, pour ceux qui voudraient les lire en voici les liens : <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-17-quoi-de-neuf\/\">Java 17<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-16-quoi-de-neuf\/\">Java 16<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-15-quoi-de-neuf\/\">Java 15<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-14-quoi-de-neuf\/\">Java 14<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-13-quoi-de-neuf\/\">Java 13<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-12-quoi-de-neuf\/\">Java 12<\/a>, <a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-11-quoi-de-neuf\/\">Java 11<\/a>,\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-10-quoi-de-neuf\/\">Java 10,<\/a>\u00a0et\u00a0<a href=\"http:\/\/www.loicmathieu.fr\/wordpress\/informatique\/les-nouveautes-de-java-9-pour-les-developeurs\/\">Java 9<\/a>.<\/p>\n<h2>JEP 400: UTF-8 by Default<\/h2>\n<p>Avec la JEP 400, le charset par d\u00e9faut devient UTF-8 pour tous les OS et dans toutes les locales.\nIl est possible d&rsquo;utiliser la variable syst\u00e8me <code>file.encoding<\/code> pour configurer un charset par d\u00e9faut diff\u00e9rent ou de la configurer \u00e0 <code>COMPAT<\/code> pour revenir au fonctionnement pr\u00e9c\u00e9dent.<\/p>\n<p>Plus d&rsquo;informations dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/400\" rel=\"noopener\" target=\"_blank\">JEP-400<\/a>.<\/p>\n<h2>JEP 413: Code Snippets in Java API Documentation<\/h2>\n<p>Ajout d&rsquo;un nouveau tag JavaDoc <a>@snippet<\/code>code&gt;@snippet&lt;\/code<\/a> qui peut \u00eatre utilis\u00e9 pour d\u00e9finir un fragment de code. Celui-ci est plus flexible que le tag <a>@code<\/code>code&gt;@code&lt;\/code<\/a> existant, n&rsquo;a pas besoin d&rsquo;escaper les caract\u00e8res sp\u00e9ciaux, et permet m\u00eame d&rsquo;inclure des fragments de code depuis un fichier externe.<\/p>\n<p>Exemple de fragment d\u00e9fini au sein de la JavaDoc :<\/p>\n<pre>\n\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet :\n * if (v.isPresent()) {\n *     System.out.println(\"v: \" + v.get());\n * }\n * }\n *\/\n<\/pre>\n<p>Exemple de fragment d\u00e9fini en dehors de la JavaDoc :<\/p>\n<pre>\n\/**\n * The following code shows how to use {@code Optional.isPresent}:\n * {@snippet file=\"ShowOptional.java\" region=\"example\"}\n *\/\n<\/pre>\n<p>Ce fragment pointe vers la section <strong>example<\/strong> du fichier <code>ShowOptional.java<\/code> :<\/p>\n<pre>\npublic class ShowOptional {\n    void show(Optional v) {\n        \/\/ @start region=\"example\"\n        if (v.isPresent()) {\n            System.out.println(\"v: \" + v.get());\n        }\n        \/\/ @end\n    }\n}\n<\/pre>\n<p>Il y a plusieurs options possibles de formatage et d&rsquo;inclusion des fragments externes; vos fragments deviennent alors ex\u00e9cutables, vous pouvez m\u00eame les d\u00e9finir dans des tests JUnit par exemple, pour qu&rsquo;ils soient test\u00e9s en m\u00eame temps que le reste de votre code.\nPlus d&rsquo;exemple dans cet article de Gunnar Morling : <a href=\"https:\/\/www.morling.dev\/blog\/executable-javadoc-code-snippets\/\" rel=\"noopener\" target=\"_blank\">Executable JavaDoc Code Snippets<\/a>.<\/p>\n<p>Plus d&rsquo;informations dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/413\" rel=\"noopener\" target=\"_blank\">JEP-413<\/a>.<\/p>\n<h2>JEP 408: Simple Web Server<\/h2>\n<p>Cette JEP ajoute \u00e0 la distribution OpenJDK un serveur web minimaliste qui permet de servir des fichiers statiques depuis un r\u00e9pertoire via un outil ligne de commande : <code>jwebserver<\/code>.<\/p>\n<p>Par d\u00e9faut, ce serveur web s&rsquo;expose sur localhost (configurable via <code>-b<\/code>), utilise le port 80 (configurable via <code>-p<\/code>), et sert des fichiers statiques dans le r\u00e9pertoire courant (configurable via <code>-d<\/code>).\nChaque acc\u00e8s \u00e0 celui-ci sera logu\u00e9 dans la sortie standard.<\/p>\n<p>En plus d&rsquo;un outil ligne de commande, vous pouvez utiliser la classe <code>SimpleFileServer<\/code> pour instancier un serveur web via son API Java.<\/p>\n<pre>\nvar server = SimpleFileServer.createFileServer(new InetSocketAddress(8080), \n        Path.of(\"\/some\/path\"), OutputLevel.VERBOSE);\nserver.start()\n<\/pre>\n<p>Plus d\u2019exemples d&rsquo;utilisation de l&rsquo;API Java dans l&rsquo;article <a href=\"https:\/\/inside.java\/2021\/12\/06\/working-with-the-simple-web-server\/\" rel=\"noopener\" target=\"_blank\">Working with the Simple Web Server<\/a> de Julia Boes.<\/p>\n<p>Plus d&rsquo;informations dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/408\" rel=\"noopener\" target=\"_blank\">JEP-408<\/a>.<\/p>\n<h2>JEP 421: Deprecate Finalization for Removal<\/h2>\n<p>La finalisation est le m\u00e9canisme par lequel il est possible d&rsquo;effectuer automatiquement des actions juste avant la destruction d&rsquo;un objet. Ce m\u00e9canisme a un ensemble de probl\u00e8me, entre autres, il d\u00e9laie le moment o\u00f9 ces actions sont effectu\u00e9es au passage du garbage collector et une m\u00e9thode <code>finalize()<\/code> mal cod\u00e9e peut faire revivre la r\u00e9f\u00e9rence \u00e0 d\u00e9truire.<\/p>\n<p>Depuis java 9 et la d\u00e9pr\u00e9ciation de la m\u00e9thode <code>finalize()<\/code> de la classe <code>Object<\/code>, il est d\u00e9conseill\u00e9 d&rsquo;utiliser la finalisation et, pour lib\u00e9rer des ressources li\u00e9es \u00e0 une classe, il est conseill\u00e9 d&rsquo;utiliser d&rsquo;autres m\u00e9canismes tel que le <code>try-with-resource<\/code> ou la nouvelle api <code>Cleaner<\/code>.<\/p>\n<p>La JEP 421 va un pas plus loin dans la suppression de la finalisation en d\u00e9pr\u00e9ciant pour suppression le m\u00e9canisme de finalisation lui-m\u00eame. Vous pouvez d\u00e8s \u00e0 pr\u00e9sent tester votre code sans finalisation via l&rsquo;option JVM <code>--finalization=disabled<\/code>.<\/p>\n<p>Plus d&rsquo;informations dans la <a href=\"https:\/\/openjdk.java.net\/jeps\/421\" rel=\"noopener\" target=\"_blank\">JEP-421<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Chaque nouvelle version du JDK apporte ses optimisations de performances (entre autres GC et m\u00e9thodes intrisics), et de s\u00e9curit\u00e9. Celle-ci ne fait pas d\u00e9faut, et on peut citer entre autres des optimisations dans G1 GC (am\u00e9lioration de la gestion des remember set, voir <a href=\"https:\/\/bugs.openjdk.java.net\/browse\/JDK-8017163\" rel=\"noopener\" target=\"_blank\">JDK-8017163<\/a>) et Parallel GC, ainsi que dans la gestion des encoding des cha\u00eenes de caract\u00e8res.\nUn autre ajout notable est le support de la <a href=\"http:\/\/openjdk.java.net\/jeps\/192\" rel=\"noopener\" target=\"_blank\">d\u00e9-duplication de String<\/a> pour les garbage collector Serial GC, Parallel GC et ZGC.<\/p>\n<p>On peut aussi noter deux JEP importantes sur des m\u00e9canismes internes de la JVM :<\/p>\n<ul><li><a href=\"https:\/\/openjdk.java.net\/jeps\/418\" rel=\"noopener\" target=\"_blank\">JEP 418<\/a> : Internet-Address Resolution SPI : possibilit\u00e9 de changer l&rsquo;impl\u00e9mentation par d\u00e9faut de r\u00e9solution des adresses internet.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/416\" rel=\"noopener\" target=\"_blank\">JEP 416<\/a> : Reimplement Core Reflection with Method Handles : pr\u00e9c\u00e9demment il y avait trois impl\u00e9mentations permettant de faire des appels de m\u00e9thode dynamiquement : VM native method (interne), dynamic bytecode et Unsafe (utilis\u00e9 par java.lang.reflect), et pour finir les method handles (java.lang.invoke). L&rsquo;API de reflection (java.lang.reflect) a \u00e9t\u00e9 r\u00e9\u00e9crite pour utiliser l&rsquo;API MethodHandle pour en supprimer une.<\/li>\n<\/ul>\n<p>D&rsquo;autres changements en terme de s\u00e9curit\u00e9 ont \u00e9t\u00e9 impl\u00e9ment\u00e9, vous pouvez lire cet article de Sean Mullan sur le sujet : <a href=\"https:\/\/seanjmullan.org\/blog\/2022\/03\/23\/jdk18\" rel=\"noopener\" target=\"_blank\">JDK 18 Security Enhancements<\/a>.<\/p>\n<h2>Les fonctionnalit\u00e9s qui restent en preview<\/h2>\n<p>Les fonctionnalit\u00e9s suivantes restent en preview (ou en incubator module).<\/p>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<ul><li><a href=\"https:\/\/openjdk.java.net\/jeps\/417\" rel=\"noopener\" target=\"_blank\">JEP-417<\/a> &#8211; Vector API : troisi\u00e8me incubation de la fonctionnalit\u00e9.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/419\" rel=\"noopener\" target=\"_blank\">JEP-419<\/a> &#8211; Foreign Function &amp; Memory API : second incubator pour ces deux fonctionnalit\u00e9s rassembl\u00e9es dans une m\u00eame JEP.<\/li>\n\n<li><a href=\"https:\/\/openjdk.java.net\/jeps\/420\" rel=\"noopener\" target=\"_blank\">JEP-420<\/a> &#8211; Pattern Matching for switch : seconde preview avec quelques am\u00e9liorations.<\/li>\n<\/ul>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li><code>Duration.isPositive()<\/code><\/li>\n\n<li><code>Math<\/code> et <code>StrictMath<\/code> ont vu l&rsquo;ajout de nombreuses nouvelles m\u00e9thodes : <code>ceilDiv<\/code>, <code>ceilDivExact<\/code>, <code>ceilMod<\/code>, <code>divideExact<\/code>, <code>floorDivExact<\/code> et <code>unsignedMultiplyHigh<\/code><\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 18 peuvent \u00eatre trouv\u00e9es dans <a href=\"https:\/\/javaalmanac.io\/jdk\/18\/apidiff\/17\/\" rel=\"noopener\" target=\"_blank\">The Java Version Almanac &#8211; New APIs in Java 18<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Cette nouvelle version de Java n&rsquo;apporte pas beaucoup de nouveaut\u00e9s, mais fait avancer le projet Panama (Vector API, Foreign Function &amp; Memory API). On esp\u00e8re pour Java 19 avoir les premi\u00e8res JEP des projets Loom (lightweight thread) et Valhalla (value\/inline\/primitive classes) qui sont en cours d&rsquo;\u00e9criture.<\/p>\n<p>Il faut quand m\u00eame noter la d\u00e9pr\u00e9ciation de la finalisation pour suppression, m\u00eame si sa suppression n&rsquo;est pas pour tout de suite, c&rsquo;est quand m\u00eame un signe fort dans cette direction.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 18 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui voudraient les lire en voici les liens : Java 17, Java 16, Java 15, Java 14, Java 13, Java 12, Java 11,\u00a0Java 10,\u00a0et\u00a0Java 9. JEP 400: UTF-8 by Default Avec&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-18-quoi-de-neuf\/\">Lire la suite<span class=\"screen-reader-text\"> Lire la suite<\/span><\/a><\/p><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"activitypub_content_warning":"","activitypub_content_visibility":"","activitypub_max_image_attachments":4,"activitypub_interaction_policy_quote":"anyone","activitypub_status":"","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[9],"tags":[11,201,163],"class_list":["post-1375","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java18","tag-whatsnew"],"aioseo_notices":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":856,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-next\/","url_meta":{"origin":1375,"position":0},"title":"Java.Next","author":"admin","date":"mercredi 31 octobre 2018","format":false,"excerpt":"Ma premi\u00e8re contribution au blog de Zenika est un article qui parle du futur (ou du pr\u00e9sent) de Java et des changements pour les d\u00e9veloppeurs dans les versions 9, 10 et 11. La gouvernance de Java y est aussi abord\u00e9. Cet article reprend et r\u00e9sume les articles que j'ai pr\u00e9c\u00e9demment\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":829,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-11-quoi-de-neuf\/","url_meta":{"origin":1375,"position":1},"title":"Java 11  : quoi de neuf ?","author":"admin","date":"lundi  1 octobre 2018","format":false,"excerpt":"Maintenant que Java 11 est sorti, c'est le moment de faire le tour des fonctionnalit\u00e9s qu'apporte cette version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res version de Java, pour ceux qui voudraient les lires en voici les liens : Java 10,\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":712,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/demarrage-jvm-8-vs-9\/","url_meta":{"origin":1375,"position":2},"title":"D\u00e9marrage JVM 8 vs 9","author":"admin","date":"jeudi 31 ao\u00fbt 2017","format":false,"excerpt":"Introduction En parcourant la mailing liste d'open JDK (core-lib-dev) j'ai vu plusieurs threads de mail \u00e0 propos d'optimisation de temps de d\u00e9marrage et d'occupation m\u00e9moire d'une JVM \"minimale\". Ce travail a \u00e9t\u00e9 r\u00e9alis\u00e9 en grande partie par Claes Redestad (Oracle) lors du d\u00e9veloppement de Java 9. J'ai donc d\u00e9cid\u00e9 de\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":722,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-10-quoi-de-neuf\/","url_meta":{"origin":1375,"position":3},"title":"Java 10 : quoi de neuf ?","author":"admin","date":"lundi 26 mars 2018","format":false,"excerpt":"Maintenant que Java 10 est sorti, il est temps de se pencher sur les nouveaut\u00e9s de cette version. Comme pour mon pr\u00e9c\u00e9dent article sur java 9, je vais me pencher principalement sur les changements qui impacterons les d\u00e9veloppeurs utilisant Java en laissant de c\u00f4t\u00e9 les changements internes\/anecdotique\/sur des API peu\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1839,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-vers-une-integrite-par-defaut-de-la-jvm\/","url_meta":{"origin":1375,"position":4},"title":"Java : vers une int\u00e9grit\u00e9 par d\u00e9faut de la JVM","author":"admin","date":"mardi  4 f\u00e9vrier 2025","format":false,"excerpt":"Cet article est paru pour la premi\u00e8re fois dans le magazine Programmez! Hors s\u00e9rie #16. La Machine Virtuelle Java (JVM) est un environnement d'ex\u00e9cution qui permet \u00e0 des programmes \u00e9crits en Java (ou dans d'autres langages compil\u00e9s en bytecode Java) de s'ex\u00e9cuter sur diff\u00e9rents syst\u00e8mes d'exploitation et architectures mat\u00e9rielles. D\u00e8s\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1112,"url":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-15-quoi-de-neuf\/","url_meta":{"origin":1375,"position":5},"title":"Java 15 : quoi de neuf ?","author":"admin","date":"jeudi  2 juillet 2020","format":false,"excerpt":"Maintenant que Java 15 est features complete (Rampdown Phase One au jour d\u2019\u00e9criture de l\u2019article), c\u2019est le moment de faire le tour des fonctionnalit\u00e9s qu\u2019apporte cette nouvelle version, \u00e0 nous, les d\u00e9veloppeurs. Cet article fait partie d\u2019une suite d\u2019article sur les nouveaut\u00e9s des derni\u00e8res versions de Java, pour ceux qui\u2026","rel":"","context":"Dans &quot;informatique&quot;","block_context":{"text":"informatique","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/category\/informatique\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1375","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/comments?post=1375"}],"version-history":[{"count":1,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1375\/revisions"}],"predecessor-version":[{"id":1449,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1375\/revisions\/1449"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1375"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1375"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1375"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}