{"id":1816,"date":"2024-07-25T15:59:15","date_gmt":"2024-07-25T13:59:15","guid":{"rendered":"https:\/\/www.loicmathieu.fr\/wordpress\/?p=1816"},"modified":"2025-04-14T11:21:40","modified_gmt":"2025-04-14T09:21:40","slug":"java-23-quoi-de-neuf","status":"publish","type":"post","link":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-23-quoi-de-neuf\/","title":{"rendered":"Java 23 : quoi de neuf ?"},"content":{"rendered":"<p>Maintenant que Java 23 est features complete (Rampdown Phase Two 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-22-quoi-de-neuf\/\">Java 22<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-21-quoi-de-neuf\/\">Java 21<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-20-quoi-de-neuf\/\">Java 20<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-19-quoi-de-neuf\/\">Java 19<\/a>, <a href=\"https:\/\/www.loicmathieu.fr\/wordpress\/informatique\/java-18-quoi-de-neuf\/\">Java 18<\/a>, <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<p>Tout d&rsquo;abord, il y a eu un \u00e9v\u00e9nement qui \u00e0 ma connaissance ne s&rsquo;\u00e9tait jamais pass\u00e9 dans une release de Java, une fonctionnalit\u00e9 en preview a \u00e9t\u00e9 supprim\u00e9e ! La fonctionnalit\u00e9 String Templates apparue en tant que preview feature en Java 21 a \u00e9t\u00e9 supprim\u00e9e, un re-design global de cette fonctionnalit\u00e9 sera fait, car elle avait soulev\u00e9 de nombreux d\u00e9bats et ne semblait pas r\u00e9pondre aux attentes de la communaut\u00e9.<\/p>\n<p>La <a href=\"https:\/\/openjdk.org\/jeps\/12\" rel=\"noopener\" target=\"_blank\">JEP 12<\/a> qui d\u00e9finit le processus des preview feature dit clairement qu&rsquo;une feature en preview peut \u00eatre supprim\u00e9e \u00e0 la discr\u00e9tion du responsable de la fonctionnalit\u00e9 sans n\u00e9cessit\u00e9 de nouvelle JEP.<\/p>\n<blockquote>\nEventually, the JEP owner must decide the preview feature&rsquo;s fate. If the decision is to remove the preview feature, then the owner must file an issue in JBS to remove the feature in the next JDK feature release; no new JEP is needed.\n<\/blockquote>\n<p>C&rsquo;est donc ce qui a \u00e9t\u00e9 fait ici.<\/p>\n<p>Plus d&rsquo;information sur la suppression des String Templates dans le ticket <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8329949\" rel=\"noopener\" target=\"_blank\">JDK-8329949<\/a>.<\/p>\n<h2>JEP 455 &#8211; Primitive Types in Patterns, instanceof, and switch (Preview)<\/h2>\n<p>Fonctionnalit\u00e9 en preview qui ajoute le support des types primitifs dans les <code>instanceof<\/code> et les <code>switch<\/code>, et enrichit le pattern matching pour supporter des patterns de types primitifs : dans  les <code>instanceof<\/code>, dans les cases des <code>switch<\/code>, et dans la d\u00e9construction d&rsquo;un record.<\/p>\n<p><strong>Les switchs supportent maintenant tous les types primitifs.<\/strong><\/p>\n<p>Exemple :<\/p>\n<pre>\nlong l = ...;\nswitch (l) {\n    case 1L              -&gt; ...;\n    case 2L              -&gt; ...;\n    case 10_000_000_000L -&gt; ...;\n    default -&gt; ...;\n}\n<\/pre>\n<p><strong>On peut dor\u00e9navant utiliser <code>instanceof<\/code> pour tous les types primitifs.<\/strong><\/p>\n<p>Exemple tir\u00e9 de la JEP :<\/p>\n<pre>\nif (i instanceof byte) {  \/\/ value of i fits in a byte\n    ... (byte)i ...       \/\/ traditional cast required\n}\n<\/pre>\n<p>Mais le plus int\u00e9ressant est le support du pattern matching, voici des exemples pour chaque endroit o\u00f9 il est dor\u00e9navant possible de r\u00e9aliser du pattern matching pour un type primitif.<\/p>\n<p>Exemple de pattern matching d&rsquo;un type primitif au sein d&rsquo;un <code>switch<\/code> tir\u00e9 de la JEP :<\/p>\n<pre>\nswitch (x.getStatus()) {\n    case 0 -&gt; \"okay\";\n    case 1 -&gt; \"warning\";\n    case 2 -&gt; \"error\";\n    case int i -&gt; \"unknown status: \" + i;\n}\n<\/pre>\n<p>Les guards sont aussi support\u00e9s via la clause <code>when<\/code> :<\/p>\n<pre>\nswitch (x.getStatus()) {\n    case 0 -&gt; \"okay\";\n    case 1 -&gt; \"warning\";\n    case int i when i &gt; 1 &amp;&amp; i  \"client error: \" + i;\n    case int i when i &gt; 100 -&gt; \"server error: \" + i;\n}\n<\/pre>\n<p>Exemple de pattern matching d&rsquo;un type primitif au sein d&rsquo;un <code>instanceof<\/code> tir\u00e9 de la JEP :<\/p>\n<pre>\nif (i instanceof byte b) {\n    ... b ...\n}\n<\/pre>\n<p>Exemple de pattern matching d&rsquo;un type primitif lors de la d\u00e9construction d&rsquo;un record :<\/p>\n<pre>\n\/\/ JSON didn't differentiates integers to doubles, so a JSON number should be a double.\nrecord JsonNumber(double number) implements JsonValue { }\n\nvar number = new JsonNumber(30);\n\/\/ Previously we can only deconstruct a record via a its exact component type: double,\n\/\/ now we can deconstruct and match a different priitive type\nif (json instanceof JsonObject(int number)) {\n    \/\/ ...\n}\n<\/pre>\n<p>Cette \u00e9volution a n\u00e9cessit\u00e9 d&rsquo;impl\u00e9menter des r\u00e8gles de conversion au sein du pattern matching, pour qu&rsquo;un type primitif match un autre type primitif, comme dans l&rsquo;exemple pr\u00e9c\u00e9dent 30 a match\u00e9 un <code>int<\/code> m\u00eame si le composant du record \u00e9tait d\u00e9fini en tant qu&rsquo;un double, il faut que le type cible soit couvert par le test du pattern. Ici 30 est bien couvert par un int. Les valeurs non couvertes seront rejet\u00e9es.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/455\" title=\"JEP 455\" rel=\"noopener\" target=\"_blank\">JEP 455<\/a>.<\/p>\n<h2>JEP 467 &#8211; Markdown Documentation Comments<\/h2>\n<p>Fonctionnalit\u00e9 qui permet d&rsquo;\u00e9crire les commentaires de la documentation <strong>JavaDoc<\/strong> en <a href=\"https:\/\/wikipedia.org\/wiki\/Markdown\" title=\"Markdown\" rel=\"noopener\" target=\"_blank\">Markdown<\/a> et plus uniquement avec un mix de tag HTML et de tag JavaDoc.<\/p>\n<p>\u00c9crire du code HTML n&rsquo;est pas toujours facile et tr\u00e8s lisible sans un rendu, de plus, les tags JavaDoc sont parfois compliqu\u00e9s \u00e0 utiliser. Markdown est un langage qui est \u00e0 la fois lisible sans rendu, et simple d&rsquo;utilisation. L&rsquo;utiliser pour des commentaires JavaDoc est une super alternative. Markdown supporte l&rsquo;utilisation de tag HTML offrant une grande flexibilit\u00e9, les tags sp\u00e9cifiques JavaDoc sont toujours support\u00e9s si n\u00e9cessaire.<\/p>\n<p>Un commentaire en markdown commence par 3 slashs : <code>\/\/\/<\/code>.<\/p>\n<p>Voici un exemple tir\u00e9 de la JEP :<\/p>\n<pre>\n\/**\n * Returns a hash code value for the object. This method is\n * supported for the benefit of hash tables such as those provided by\n * {@link java.util.HashMap}.\n * <p>\n * The general contract of {@code hashCode} is:\n * <ul>\n * <li>Whenever it is invoked on the same object more than once during\n *     an execution of a Java application, the {@code hashCode} method\n *     must consistently return the same integer, provided no information\n *     used in {@code equals} comparisons on the object is modified.\n *     This integer need not remain consistent from one execution of an\n *     application to another execution of the same application.\n * <\/li><li>If two objects are equal according to the {@link\n *     #equals(Object) equals} method, then calling the {@code\n *     hashCode} method on each of the two objects must produce the\n *     same integer result.\n * <\/li><li>It is $ly;em&gt;not$lt;\/em&gt; required that if two objects are unequal\n *     according to the {@link #equals(Object) equals} method, then\n *     calling the {@code hashCode} method on each of the two objects\n *     must produce distinct integer results.  However, the programmer\n *     should be aware that producing distinct integer results for\n *     unequal objects may improve the performance of hash tables.\n * <\/li><\/ul>\n *\n * @implSpec\n * As far as is reasonably practical, the {@code hashCode} method defined\n * by class {@code Object} returns distinct integers for distinct objects.\n *\n * @return  a hash code value for this object.\n * @see     java.lang.Object#equals(java.lang.Object)\n * @see     java.lang.System#identityHashCode\n *\/\n<\/pre>\n<p>Qui serait \u00e9crit de la sorte en Markdown :<\/p>\n<pre>\n\/\/\/ Returns a hash code value for the object. This method is\n\/\/\/ supported for the benefit of hash tables such as those provided by\n\/\/\/ [java.util.HashMap].\n\/\/\/\n\/\/\/ The general contract of `hashCode` is:\n\/\/\/\n\/\/\/   - Whenever it is invoked on the same object more than once during\n\/\/\/     an execution of a Java application, the `hashCode` method\n\/\/\/     must consistently return the same integer, provided no information\n\/\/\/     used in `equals` comparisons on the object is modified.\n\/\/\/     This integer need not remain consistent from one execution of an\n\/\/\/     application to another execution of the same application.\n\/\/\/   - If two objects are equal according to the\n\/\/\/     [equals][#equals(Object)] method, then calling the\n\/\/\/     `hashCode` method on each of the two objects must produce the\n\/\/\/     same integer result.\n\/\/\/   - It is _not_ required that if two objects are unequal\n\/\/\/     according to the [equals][#equals(Object)] method, then\n\/\/\/     calling the `hashCode` method on each of the two objects\n\/\/\/     must produce distinct integer results.  However, the programmer\n\/\/\/     should be aware that producing distinct integer results for\n\/\/\/     unequal objects may improve the performance of hash tables.\n\/\/\/\n\/\/\/ @implSpec\n\/\/\/ As far as is reasonably practical, the `hashCode` method defined\n\/\/\/ by class `Object` returns distinct integers for distinct objects.\n\/\/\/\n\/\/\/ @return  a hash code value for this object.\n\/\/\/ @see     java.lang.Object#equals(java.lang.Object)\n\/\/\/ @see     java.lang.System#identityHashCode\n<\/pre>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/467\" title=\"JEP 467\" rel=\"noopener\" target=\"_blank\">JEP 467<\/a>.<\/p>\n<h2>JEP 471 &#8211; Deprecate the Memory-Access Methods in sun.misc.Unsafe for Removal<\/h2>\n<p><strong>Unsafe<\/strong> est, comme son nom l&rsquo;indique, une classe interne et non support\u00e9e du JDK qu&rsquo;il n&rsquo;est pas sans danger d&rsquo;appeler. Pour des raisons historiques, de nombreux frameworks bas-niveau utilisaient Unsafe pour des acc\u00e8s m\u00e9moire plus rapide. Gr\u00e2ce aux fonctionnalit\u00e9s <strong>VarHandle API<\/strong> (<a href=\"https:\/\/openjdk.org\/jeps\/193\" rel=\"noopener\" target=\"_blank\">JEP 193<\/a>, depuis Java 9) et <strong>Foreign Function &amp; Memory API<\/strong> (<a href=\"https:\/\/openjdk.org\/jeps\/454\" rel=\"noopener\" target=\"_blank\">JEP 454<\/a>, depuis Java 22), il y a maintenant des remplacements pour les m\u00e9thodes d&rsquo;Unsafe acc\u00e9dant \u00e0 la m\u00e9moire qui sont aussi performantes mais plus s\u00fbres et support\u00e9es. Au total c&rsquo;est plus de 79 m\u00e9thodes sur les 87 que contient Unsafe qui sont concern\u00e9es, permettant d\u2019approcher le moment ou la classe en enti\u00e8re pourra \u00eatre d\u00e9pr\u00e9ci\u00e9e puis supprim\u00e9e !<\/p>\n<p>D\u00e9pr\u00e9cier ces m\u00e9thodes indique clairement qu&rsquo;il est temps d&rsquo;utiliser ces remplacements ! N\u00e9anmoins, la plupart d&rsquo;entre nous ne devraient pas voir ces changements, car Unsafe est rarement utilis\u00e9 autre part que dans des frameworks ou des librairies.<\/p>\n<p>Ces m\u00e9thodes seront d\u00e9pr\u00e9ci\u00e9es puis d\u00e9grad\u00e9es progressivement :<\/p>\n<ul><li>Phase 1 : d\u00e9pr\u00e9ciation en Java 23 (cette JEP)<\/li>\n\n<li>Phase 2 : log un warning au runtime si utilis\u00e9es, en Java 24 ou 25<\/li>\n\n<li>Phase 3 : g\u00e9n\u00e8re une exception par d\u00e9faut (comportement modifiable via une option de ligne de commande), en Java 26 ou sup\u00e9rieur<\/li>\n\n<li>Phases 4 et 5 : suppression des m\u00e9thodes apr\u00e8s Java 26 (m\u00e9thodes pour acc\u00e8s m\u00e9moire on-heap, puis off-heap)<\/li>\n<\/ul>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/471\" title=\"JEP 471\" rel=\"noopener\" target=\"_blank\">JEP 471<\/a>.<\/p>\n<h2>JEP 474 &#8211; ZGC: Generational Mode by Default<\/h2>\n<p>ZGC est un Garbage Collector cr\u00e9\u00e9 pour supporter des heaps de tailles tr\u00e8s importantes (plusieurs t\u00e9raoctets) avec des pauses tr\u00e8s faibles (de l\u2019ordre de la milliseconde).<\/p>\n<p>L\u2019ajout d\u2019une heap g\u00e9n\u00e9rationnelle en Java 21 via la <a href=\"https:\/\/openjdk.org\/jeps\/439\" rel=\"noopener\" target=\"_blank\">JEP 439<\/a> lui permet de supporter des workloads diff\u00e9rents en consommant moins de ressources.<\/p>\n<p>Le mode g\u00e9n\u00e9rationnel est maintenant le d\u00e9faut.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/474\" title=\"JEP 471\" rel=\"noopener\" target=\"_blank\">JEP 474<\/a>.<\/p>\n<h2>JEP 476 &#8211; Module Import Declarations (Preview)<\/h2>\n<p>En Java, il est possible d&rsquo;importer :<\/p>\n<ul><li>Toutes les classes d&rsquo;un package avec l&rsquo;instruction <code>import java.util.*;<\/code><\/li>\n\n<li>Une classe avec l&rsquo;instruction <code>import java.util.Map;<\/code><\/li>\n\n<li>Toutes les m\u00e9thodes et variables statiques d&rsquo;une classe avec l&rsquo;instruction <code>import static org.junit.jupiter.api.Assertions.*;<\/code><\/li>\n\n<li>Une m\u00e9thode ou une variable statique avec l&rsquo;instruction <code>import static org.junit.jupiter.api.Assertions.assertTrue;<\/code><\/li>\n<\/ul>\n<p>Mais il n&rsquo;\u00e9tait pas possible d&rsquo;importer en une seule instruction toutes les classes d&rsquo;un module, c&rsquo;est chose faite via l&rsquo;instruction <code>import module java.base;<\/code> qui va en une instruction importer toutes les classes de tous les packages export\u00e9s du module <code>java.base<\/code> ainsi que ceux des modules requis transitivement par <code>java.base<\/code>.<\/p>\n<p>Plus d&rsquo;information dans la <a href=\"https:\/\/openjdk.org\/jeps\/476\" title=\"JEP 471\" rel=\"noopener\" target=\"_blank\">JEP 476<\/a>.<\/p>\n<h2>Les fonctionnalit\u00e9s qui sortent de preview<\/h2>\n<p>Aucune fonctionnalit\u00e9 pr\u00e9c\u00e9demment en preview (ou en incubator module) n&rsquo;est sortie de preview ou d&rsquo;incubation en Java 23.<\/p>\n<p>\u00c0 part bien s\u00fbr la fonctionnalit\u00e9 String Templates dont j&rsquo;ai parl\u00e9 en introduction qui est sortie de preview pour aller nulle part, car supprim\u00e9e.<\/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<ul><li><a href=\"https:\/\/openjdk.org\/jeps\/466\" rel=\"noopener\" target=\"_blank\">JEP 466<\/a> &#8211; <strong>Class-File API<\/strong> : seconde preview, API standard pour parser, g\u00e9n\u00e9rer et transformer les fichiers de classe Java. Am\u00e9liorations bas\u00e9es sur les retours d&rsquo;utilisation. On peut noter que la migration du JDK vers cette nouvelle API a continu\u00e9e en Java 23.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/469\" rel=\"noopener\" target=\"_blank\">JEP 469<\/a> &#8211; <strong>Vector API<\/strong> : huiti\u00e8me incubation, API permettant d\u2019exprimer des calculs vectoriels qui se compilent au moment de l\u2019ex\u00e9cution en instructions vectorielles pour les architectures CPU prises en charge. Aucun changement, il a \u00e9t\u00e9 act\u00e9 dans la JEP que la Vector API sera en incubation tant que les fonctionnalit\u00e9s du projet Valhalla ne seront pas disponibles en preview. Ce qui \u00e9tait attendu, car la Vector API pourra alors tirer parti des am\u00e9liorations de performance et de repr\u00e9sentation en m\u00e9moire que devrait apporter le projet Valhalla.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/473\" rel=\"noopener\" target=\"_blank\">JEP 473<\/a> &#8211; <strong>Stream Gatherers<\/strong> : seconde preview, Enrichit l\u2019API Stream avec le support d\u2019op\u00e9rations interm\u00e9diaires personnalis\u00e9es. Aucun changement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/477\">JEP 477<\/a> &#8211; <strong>Implicitly Declared Classes and Instance Main Methods<\/strong> : troisi\u00e8me preview, simplifie l\u2019\u00e9criture de programmes simple en permettant de les d\u00e9finir dans une classe implicite (sans d\u00e9claration) et dans une m\u00e9thode d\u2019instance <code>void main()<\/code>. Deux changements : les classes implicites importent automatiquement les 3 m\u00e9thodes statiques <code>print(Object)<\/code>, <code>println(Object)<\/code> et <code>readln(Object)<\/code> de la nouvelle classe <code>java.io.IO<\/code>, et elles importent automatiquement, \u00e0 la demande, les classes des packages du module <code>java.base<\/code>.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/480\" rel=\"noopener\" target=\"_blank\">JEP 480<\/a> &#8211; <strong>Structured Concurrency<\/strong> : troisi\u00e8me preview, nouvelle API permettant de simplifier l\u2019\u00e9criture de code multi-thread\u00e9 en permettant de traiter plusieurs t\u00e2ches concurrentes comme une unit\u00e9 de traitement unique. Aucun changement.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/481\" rel=\"noopener\" target=\"_blank\">JEP 481<\/a> &#8211; <strong>Scoped Values<\/strong> : troisi\u00e8me preview, permettent le partage de donn\u00e9es immuables au sein et entre les threads. Un changement mineur.<\/li>\n\n<li><a href=\"https:\/\/openjdk.org\/jeps\/482\" rel=\"noopener\" target=\"_blank\">JEP 482<\/a> &#8211; <strong>Flexible Constructor Bodies<\/strong> : seconde preview, fonctionnalit\u00e9 qui autorise des instructions <strong>avant<\/strong> l\u2019appel du constructeur parent tant que celles-ci n\u2019acc\u00e8dent pas \u00e0 l\u2019instance en cours de cr\u00e9ation. Un constructeur peut maintenant initialiser les champs de la m\u00eame classe avant d&rsquo;appeler explicitement un constructeur.<\/li>\n<\/ul>\n<p>Pour les d\u00e9tails sur celles-ci, vous pouvez vous r\u00e9f\u00e9rer \u00e0 mes articles pr\u00e9c\u00e9dents.<\/p>\n<h2>Divers<\/h2>\n<p>Divers ajouts au JDK :<\/p>\n<ul><li>Suite \u00e0 la <a href=\"https:\/\/openjdk.org\/jeps\/477\">JEP 477<\/a> &#8211; <strong>Implicitly Declared Classes and Instance Main Methods<\/strong>, en plus de la nouvelle classe <code>IO<\/code>, les m\u00eames 3 m\u00e9thodes ont \u00e9t\u00e9 ajout\u00e9es \u00e0 la classe <code>Console<\/code> : <code>print(Object)<\/code>, <code>println(Object)<\/code> et <code>readln(Object)<\/code>.<\/li>\n\n<li>La classe <code>Console<\/code> a vu l&rsquo;ajout de 3 nouvelles m\u00e9thodes permettant l&rsquo;utilisation de string format\u00e9es avec une locale : <code>format(Locale, String, Object)<\/code>, <code>printf(Locale, String, Object)<\/code> et <code>readLine(Locale, String, Object)<\/code>.<\/li>\n\n<li><code>Console.readPassword(Locale, String, Object)<\/code> : identique \u00e0 <code>Console.readPassword(String, Object)<\/code> mais en prenant une locale en param\u00e8tre pour la localisation de la cha\u00eene de caract\u00e8re.<\/li>\n\n<li><code>Inet4Address.ofPosixLiteral(String)<\/code> : cr\u00e9e une <code>Inet4Address<\/code> bas\u00e9e sur la repr\u00e9sentation textuelle fournie d&rsquo;une adresse IPv4 sous une forme compatible POSIX <strong>inet_addr<\/strong>.<\/li>\n\n<li><code>java.text.NumberFormat<\/code> et ses descendants ont vu l&rsquo;ajout des m\u00e9thodes <code>setStrict(boolean)<\/code> et <code>isStrict()<\/code> qui permet de changer le mode de formatage, le mode par d\u00e9faut est strict.<\/li>\n\n<li><code>Instant.until(Instant)<\/code> : calcule la <code>Duration<\/code> jusqu&rsquo;\u00e0 un autre <code>Instant<\/code>.<\/li>\n<\/ul>\n<p>Les m\u00e9thodes suivantes ont \u00e9t\u00e9 supprim\u00e9es, elles avaient \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9es pour suppression, et d\u00e9grad\u00e9es pour jeter une exception dans une release pr\u00e9c\u00e9dente :<\/p>\n<ul><li><code>Thread.resume()<\/code> et <code>Thread.suspend()<\/code>.<\/li>\n\n<li><code>ThreadGroup.resume()<\/code>, <code>ThreadGroup.stop()<\/code> et <code>ThreadGroup.suspend()<\/code>.<\/li>\n<\/ul>\n<p>La totalit\u00e9 des nouvelles API du JDK 23 peuvent \u00eatre trouv\u00e9es dans <a title=\"The Java Version Almanac \u2013 New APIs in Java 23\" href=\"https:\/\/javaalmanac.io\/jdk\/23\/apidiff\/22\/\" target=\"_blank\" rel=\"noopener\">The Java Version Almanac \u2013 New APIs in Java 23<\/a>.<\/p>\n<h2>Des changements internes, de la performance, et de la s\u00e9curit\u00e9<\/h2>\n<p>Le garbage collector Parallel GC a vu une r\u00e9-impl\u00e9mentation de son algorithme Full GC pour utiliser un algorithme plus classique de type <strong>parallel Mark-Sweep-Compact<\/strong>. C&rsquo;est le m\u00eame qu&rsquo;utilis\u00e9 par le garbage collector G1 et il permet d&rsquo;optimiser les performances dans certains cas sp\u00e9cifiques et r\u00e9duit l&rsquo;utilisation de la heap de 1.5% lors de l\u2019utilisation du Paralle GC. D\u2019autres changements ont \u00e9t\u00e9 faits c\u00f4t\u00e9 Garbage Collector, vous pouvez les retrouver dans cet article de Thomas Schatzl : <a href=\"https:\/\/tschatzl.github.io\/2024\/07\/22\/jdk23-g1-serial-parallel-gc-changes.html\" rel=\"noopener\" target=\"_blank\">JDK 23 G1\/Parallel\/Serial GC changes<\/a>.<\/p>\n<p>Vous pouvez vous r\u00e9f\u00e9rer \u00e0 l\u2019article de Sean Mullan pour une liste exhaustive des changements de s\u00e9curit\u00e9 inclus cette version : <a href=\"https:\/\/seanjmullan.org\/blog\/2024\/09\/17\/jdk23\" title=\"JDK 23 Security Enhancements\" rel=\"noopener\" target=\"_blank\">JDK 23 Security Enhancements<\/a>.<\/p>\n<p>Je n&rsquo;ai pas not\u00e9 d&rsquo;autres changements notables pour l&rsquo;instant, mais je mettrais cet article \u00e0 jour si j&rsquo;en d\u00e9couvre d&rsquo;autres.<\/p>\n<h2>JFR Events<\/h2>\n<p>Voici les nouveaux \u00e9v\u00e9nements Java Flight Recorder (JFR) de la JVM :<\/p>\n<ul><li><code>NativeMemoryUsageTotalPeak<\/code> : Total des pics d&rsquo;utilisation de la m\u00e9moire native pour la JVM (GraalVM Native Image uniquement). Peut ne pas \u00eatre la somme exacte des \u00e9v\u00e9nements NativeMemoryUsagePeak en raison du timing.<\/li>\n\n<li><code>NativeMemoryUsagePeak<\/code> : Utilisation maximale de la m\u00e9moire native pour un type de m\u00e9moire donn\u00e9 dans la JVM (GraalVM Native Image uniquement).<\/li>\n\n<li><code>SerializationMisdeclaration<\/code> : M\u00e9thodes et champs mal d\u00e9clar\u00e9s. Les contr\u00f4les sont g\u00e9n\u00e9ralement effectu\u00e9s une seule fois par classe s\u00e9rialisable, la premi\u00e8re fois qu&rsquo;elle est utilis\u00e9e par la s\u00e9rialisation. En cas de forte pression sur la m\u00e9moire, une classe peut \u00eatre v\u00e9rifi\u00e9e \u00e0 nouveau.<\/li>\n\n<li><code>SwapSpace<\/code> : espace swap OS<\/li>\n<\/ul>\n<p>Vous pouvez retrouver tous les \u00e9v\u00e9nements JFR support\u00e9s dans cette version de Java sur la page <a title=\"JFR Events\" href=\"https:\/\/sap.github.io\/SapMachine\/jfrevents\/23.html\" target=\"_blank\" rel=\"noopener\">JFR Events<\/a>.<\/p>\n<h2>Conclusion<\/h2>\n<p>Cette nouvelle version de Java est plut\u00f4t chiche en nouvelles fonctionnalit\u00e9s, et peu de fonctionnalit\u00e9s en cours de d\u00e9veloppement sont sorties de preview.<\/p>\n<p>Le support des types primitifs dans le pattern matching ainsi que le support du Markdown dans la JavaDoc sont des am\u00e9liorations n\u00e9anmoins fort int\u00e9ressantes, mais la disparition des String Templates sans rempla\u00e7ant fait augurer d&rsquo;un support de cette fonctionnalit\u00e9 tr\u00e8s attendue assez \u00e9loign\u00e9 dans le temps.<\/p>\n<p>Pour retrouver tous les changements de Java 23, se r\u00e9f\u00e9rer aux <a href=\"https:\/\/jdk.java.net\/23\/release-notes\" rel=\"noopener\" target=\"_blank\">release notes<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>Maintenant que Java 23 est features complete (Rampdown Phase Two 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 22, Java 21, Java 20, Java 19, Java 18, Java 17, Java 16, Java 15, Java 14, Java 13, Java 12,&#8230;<p class=\"read-more\"><a class=\"btn btn-default\" href=\"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/informatique\/java-23-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,222,163],"class_list":["post-1816","post","type-post","status-publish","format-standard","hentry","category-informatique","tag-java","tag-java23","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":1816,"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":1816,"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":1816,"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":1816,"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":1816,"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":1816,"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\/1816","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=1816"}],"version-history":[{"count":24,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1816\/revisions"}],"predecessor-version":[{"id":1934,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/posts\/1816\/revisions\/1934"}],"wp:attachment":[{"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/media?parent=1816"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/categories?post=1816"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.loicmathieu.fr\/wordpress\/fr\/wp-json\/wp\/v2\/tags?post=1816"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}