{"id":519757,"date":"2024-10-21T16:29:15","date_gmt":"2024-10-21T15:29:15","guid":{"rendered":"https:\/\/blog.jetbrains.com\/?post_type=idea&#038;p=519757"},"modified":"2025-09-16T15:06:15","modified_gmt":"2025-09-16T14:06:15","slug":"java-23-et-intellij-idea","status":"publish","type":"idea","link":"https:\/\/blog.jetbrains.com\/fr\/idea\/2024\/10\/java-23-et-intellij-idea\/","title":{"rendered":"Java 23 et IntelliJ IDEA"},"content":{"rendered":"Les nouveaut\u00e9s introduites par Java 23 concernent les fonctionnalit\u00e9s du langage, l&#8217;API principale et la JVM, et pr\u00e9sentent un int\u00e9r\u00eat tant pour les d\u00e9butants que pour les d\u00e9veloppeurs exp\u00e9riment\u00e9s. La <a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/?section=windows\" target=\"_blank\" rel=\"noopener\">version 2024.2 d&#8217;IntelliJ IDEA<\/a> fournit une prise en charge des fonctionnalit\u00e9s de Java 23.\n\nIl n&#8217;est pas toujours \u00e9vident de suivre le rythme des publications des nouvelles versions de Java et de savoir tout ce qui a chang\u00e9, pourquoi, et comment tirer parti de ses derni\u00e8res mises \u00e0 jour et nouvelles fonctionnalit\u00e9s. Dans cet article, je pr\u00e9sente les principales nouveaut\u00e9s et mises \u00e0 jour de fonctionnalit\u00e9s de Java 23, notamment en termes de syntaxe et de s\u00e9mantique, ainsi que les points particuliers pour lesquels elles facilitent le travail des d\u00e9veloppeurs, tout en expliquant comment IntelliJ IDEA peut vous aider \u00e0 les utiliser au mieux.\n\nJ&#8217;ai choisi de parler plus particuli\u00e8rement des <a href=\"https:\/\/openjdk.org\/jeps\/455\" target=\"_blank\" rel=\"noopener\">types de donn\u00e9es primitifs dans la correspondance de motifs<\/a>, de la capacit\u00e9 d&#8217;<a href=\"https:\/\/openjdk.org\/jeps\/476\" target=\"_blank\" rel=\"noopener\">importer des modules<\/a> dans les bases de code, de la possibilit\u00e9 d&#8217;utiliser <a href=\"https:\/\/openjdk.org\/jeps\/467\" target=\"_blank\" rel=\"noopener\">Markdown dans les commentaires de la documentation<\/a>, <a href=\"https:\/\/openjdk.org\/jeps\/477\" target=\"_blank\" rel=\"noopener\">des classes d\u00e9clar\u00e9es implicitement et des m\u00e9thodes d&#8217;instance main<\/a>\u00a0et des <a href=\"https:\/\/openjdk.org\/jeps\/482\" target=\"_blank\" rel=\"noopener\">corps de constructeur flexibles<\/a>. Si cela vous int\u00e9resse, la liste de toutes les fonctionnalit\u00e9s de Java 23 est disponible <a href=\"https:\/\/openjdk.org\/projects\/jdk\/23\/\" target=\"_blank\" rel=\"noopener\">ici<\/a>.\n\nAvant d&#8217;examiner les fonctionnalit\u00e9s de Java 23, commen\u00e7ons par voir configurer rapidement IntelliJ IDEA.\n<h2 class=\"wp-block-heading\">Configuration d&#8217;IntelliJ IDEA<\/h2>\nLa prise en charge de Java 23 est disponible dans la version majeure la plus r\u00e9cente d&#8217;<a href=\"https:\/\/www.jetbrains.com\/fr-fr\/idea\/download\/?section=windows\" target=\"_blank\" rel=\"noopener\">IntelliJ IDEA<\/a>.\n\nCommencez par d\u00e9finir le SDK sur Java 23 dans <em>Project Settings<\/em>. Vous pouvez choisir de configurer IntelliJ IDEA de fa\u00e7on \u00e0 utiliser une version t\u00e9l\u00e9charg\u00e9e du JDK 23 ou de faire un t\u00e9l\u00e9chargement \u00e0 partir d&#8217;une liste de fournisseurs, ceci sans quitter l&#8217;IDE. Pour le niveau de langage, s\u00e9lectionnez \u00ab 23 (Preview) \u2013 Primitive types in patterns, implicitly declared classes, etc. \u00bb, comme indiqu\u00e9 dans la capture d&#8217;\u00e9cran ci-dessous :\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXcGxFrOGgCPb5L_8CZXY4JlVXfQ03cHWfBZOrstd5odZ4GveeblvVNMoAyPr9M7hk_xDp-F5aA7r4D0jDe2_Cn-qno5SbUT8n8o3DugiVdZE7sVUBPf_Tq3Z0GhlrTidtObLraaO7VaZNDXTHt9LmSGySDa-1.png\" alt=\"\" \/><\/figure>\nPour utiliser une fonctionnalit\u00e9 de production, par exemple les commentaires de documentation Markdown, remplacez le niveau de langage par \u00ab 23 \u2013 Markdown documentation comments \u00bb, comme illustr\u00e9 dans la capture d&#8217;\u00e9cran des param\u00e8tres ci-dessous :\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXc0gFNk5Gsa2biPt-lgJF3rdQLzHyM81GlI9OAYlVFMT2oIldzf46jfxf2lwT5U5Vb6IgtRSZLBhBeF_86kJb9z0xzpj7b5za6LZ74h69NH7YW8XN-erEt3FBrFsS4T_cZ8W-uVtSHbybyvkqcmd2GuLhlN-1.png\" alt=\"\" \/><\/figure>\nIntelliJ IDEA \u00e9tant configur\u00e9, examinons maintenant les nouvelles fonctionnalit\u00e9s du langage.\n<h2 class=\"wp-block-heading\">Types primitifs dans les motifs, instanceof et switch (fonctionnalit\u00e9 preview)<\/h2>\nSupposons que vous deviez \u00e9crire une construction conditionnelle qui ex\u00e9cute le code selon que la valeur d&#8217;une variable <code>longue<\/code> corresponde \u00e0 plusieurs valeurs litt\u00e9rales ou se situe dans une plage de valeurs.\n\nComment feriez-vous cela ? Jusqu&#8217;\u00e0 pr\u00e9sent, on pouvait seulement utiliser une construction if\/else. Mais avec Java 23, la fonctionnalit\u00e9 preview <a href=\"https:\/\/openjdk.org\/jeps\/455\" target=\"_blank\" rel=\"noopener\">Types primitifs dans les motifs, instanceof et switch<\/a> permet d&#8217;\u00e9crire cette fonctionnalit\u00e9 avec des constructions switch plus expressives et lisibles, utilisant des valeurs long pour les \u00e9tiquettes case.\n<h3 class=\"wp-block-heading\">Que signifie ajouter des types primitifs \u00e0 la correspondance de motifs ?<\/h3>\nAvant Java 23, les constructions switch (instructions et expressions) fonctionnaient avec des variables de r\u00e9f\u00e9rence et certains types de donn\u00e9es primitifs, comme <code>int<\/code>, <code>byte<\/code>, <code>short<\/code> (avec des contraintes). De plus l&#8217;op\u00e9rateur <code>instanceof<\/code> ne pouvait pas \u00eatre utilis\u00e9 avec les types de donn\u00e9es primitifs.\n\nAvec Java 23, vous pouvez utiliser TOUS les types de donn\u00e9es primitifs, notamment <code>boolean<\/code>, <code>float<\/code>, <code>double<\/code> et <code>long<\/code>, avec la correspondance de motifs dans les constructions switch et les op\u00e9rateurs <code>instanceof<\/code>. Cela s&#8217;applique \u00e0 une utilisation dans les contextes imbriqu\u00e9s et de niveau sup\u00e9rieur.\n\nPourquoi devriez-vous vous int\u00e9resser \u00e0 cette fonctionnalit\u00e9 ? La valeur d&#8217;une fonctionnalit\u00e9 d\u00e9pend de la taille de la base de code concern\u00e9e et de la fr\u00e9quence d&#8217;utilisation. Les instructions conditionnelles faisant partie des bases de la programmation, il est tr\u00e8s probable que cette fonctionnalit\u00e9 soit fr\u00e9quemment utilis\u00e9e dans votre base de code. Et m\u00eame si ce n&#8217;est pas vous qui \u00e9crivez le code, vous serez amen\u00e9 \u00e0 lire le code \u00e9crit par quelqu&#8217;un d&#8217;autre.\n\nPrenons un exemple pour mieux comprendre cette fonctionnalit\u00e9.\n<h3 class=\"wp-block-heading\">Par exemple (remplacement d&#8217;instructions if-else longues par des expression switch)<\/h3>\nImaginez une m\u00e9thode, disons <code>getHTTPCodeDesc(int)<\/code>, qui accepte un code de serveur HTTP comme valeur int et renvoie une repr\u00e9sentation sous forme de cha\u00eene correspondante, puis la v\u00e9rifie par rapport \u00e0 une valeur litt\u00e9rale ou \u00e0 une plage de valeurs.\n\nCe code semble ne pr\u00e9senter aucun probl\u00e8me a priori, nous avons d\u00e9j\u00e0 tous \u00e9crit ou lu du code similaire. Cependant, le traitement du flux des constructions if-else peut prendre plus de temps, car elles peuvent d\u00e9finir des conditions complexes qui ne sont pas limit\u00e9es \u00e0 une seule variable. Supposons que la m\u00e9thode <code>getHTTPCodeDesc()<\/code> soit d\u00e9finie comme suit\u00a0:\n<pre class=\"EnlighterJSRAW\">public String getHTTPCodeDesc(int code) {\n   if (code == 100) {\n       return \"Continue\";\n   } \n   else if (code == 200) {\n       return \"OK\";\n   } \n   else if (code == 301) {\n       return \"Moved permanently\";\n   } \n   else if (code == 302) {\n       return \"Found\";\n   } \n   else if (code == 400) {\n       return \"Bad request\";\n   } \n   else if (code == 500) {\n       return \"Internal server error\";\n   } \n   else if (code == 502) {\n       return \"Bad gateway\";\n   } \n   else if (code &gt; 100 &amp;&amp; code  200 &amp;&amp; code  302 &amp;&amp; code  400 &amp;&amp; code  502 &amp;&amp; code &lt; 600) {\n       return \"Server error\";\n   } \n   else {\n       return \"Unknown error\";\n   }\n}<\/pre>\nEn Java 23, le code pr\u00e9c\u00e9dent peut \u00eatre remplac\u00e9 par une expression switch (utilisant des primitifs comme motifs), de la fa\u00e7on suivante\u00a0:\n<pre class=\"EnlighterJSRAW\">public String getHTTPCodeDesc(int code) {\n    return switch(code) {\n        case 100 -&gt; \"Continue\";\n        case 200 -&gt; \"OK\";\n        case 301 -&gt; \"Moved Permanently\";\n        case 302 -&gt; \"Found\";\n        case 400 -&gt; \"Bad Request\";\n        case 500 -&gt; \"Internal Server Error\";\n        case 502 -&gt; \"Bad Gateway\";\n        case int i when i &gt; 100 &amp;&amp; i  \"Informational\";\n        case int i when i &gt; 200 &amp;&amp; i  \"Successful\";\n        case int i when i &gt; 302 &amp;&amp; i  \"Redirection\";\n        case int i when i &gt; 400 &amp;&amp; i  \"Client Error\";\n        case int i when i &gt; 502 &amp;&amp; i  \"Server Error\";\n        default                            -&gt; \"Unknown error\";\n    };\n}<\/pre>\nLe premier avantage \u00e9vident du code ci-dessus est qu&#8217;il est bien plus facile \u00e0 lire et \u00e0 comprendre que la version utilisant des instructions if-else. La logique du code est imm\u00e9diatement compr\u00e9hensible.\n\nUn autre avantage de ce code, moins \u00e9vident \u00e0 premi\u00e8re vue mais important, est qu&#8217;il r\u00e9duit la charge cognitive. La charge cognitive fait r\u00e9f\u00e9rence \u00e0 la quantit\u00e9 d\u2019informations dont vous disposez dans la m\u00e9moire de travail (l&#8217;espace de la m\u00e9moire de travail \u00e9tant limit\u00e9). Si vous essayez de surcharger votre m\u00e9moire de travail avec des instructions ou des informations sans lien direct avec votre objectif final, votre productivit\u00e9 diminue. Des extraits de code plus faciles \u00e0 lire aident \u00e0 concentrer votre attention sur d&#8217;autres aspects du code. Ce petit avantage constitue finalement une aide significative compte tenu de la fr\u00e9quence \u00e0 laquelle vous pouvez en b\u00e9n\u00e9ficier.\n\nPassons maintenant \u00e0 un sujet plus simple, \u00e0 savoir la syntaxe. Comme vous pouvez le voir, en utilisant le mod\u00e8le de type prot\u00e9g\u00e9 (<code>quand i &gt; 100 &amp;&amp; i &lt; 200<\/code>) (<code>int i<\/code>), l&#8217;\u00e9tiquette case prot\u00e9g\u00e9e peut avoir une valeur constante (comme 100, 200, etc.) ou une plage de valeurs sp\u00e9cifi\u00e9e \u00e0 l&#8217;aide de la correspondance de motifs. Vous pouvez \u00e9galement d\u00e9finir une clause <code>default<\/code>.\n\nDans le code pr\u00e9c\u00e9dent, la m\u00e9thode <code>getHTTPCodeDesc()<\/code> renvoie une valeur en utilisant l&#8217;expression switch. Quelle que soit la valeur que vous passez au param\u00e8tre de m\u00e9thode, c&#8217;est-\u00e0-dire <code>code<\/code> dans notre exemple, la m\u00e9thode doit renvoyer une valeur. En d&#8217;autres termes, l&#8217;expression switch doit \u00eatre exhaustive. Dans le cas contraire, IntelliJ IDEA est capable de le d\u00e9tecter et sugg\u00e8re l&#8217;ajout de la clause <code>default<\/code>, comme dans le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXdN9yBxLrTYlJJ8NpJuAoWFdtUJTUj9RTDyAEanbOe8vtHPt9OWtzpw6wgSsJAyQW33jFDMBLOJXR8Tdds_0IJLmZFT46E1FBUw0Oqn6h64Or3qHebl5Qh3AqBEmpuKTF5h68ByVhdCd0QtgAxg-1mIJ-Pz-1.gif\" alt=\"\" \/><\/figure>\nLe code pr\u00e9c\u00e9dent active une variable de type int. De m\u00eame, vous pouvez activer des variables pour tous les autres types primitifs, tels que long, double, float, etc.\n<h3 class=\"wp-block-heading\">Vous ne connaissez pas bien la correspondance de motifs ou les modifications r\u00e9centes de la construction switch ?<\/h3>\nJe vous invite \u00e0 consulter la section consacr\u00e9e <a href=\"https:\/\/blog.jetbrains.com\/idea\/2021\/09\/java-17-and-intellij-idea\/#what-is-pattern-matching\">aux bases<\/a> de la correspondance de motifs dans mon article <a href=\"https:\/\/blog.jetbrains.com\/idea\/2021\/09\/java-17-and-intellij-idea\/\">Java 17 et IntelliJ IDEA<\/a>. Et si vous souhaitez en savoir plus sur la facon dont la correspondance de motifs est utilis\u00e9e dans les constructions switch, j&#8217;ai aussi \u00e9crit un article d\u00e9taill\u00e9 sur ce sujet, <a href=\"https:\/\/blog.jetbrains.com\/idea\/2024\/01\/evolution-of-the-switch-construct-in-java-why-should-you-care\/\">Evolution of the Switch Construct in Java\u2014Why Should you Care?<\/a>, dans lequel j&#8217;explique comment les constructions switch utilisent la correspondance de motifs pour v\u00e9rifier les valeurs de r\u00e9f\u00e9rence par rapport \u00e0 diff\u00e9rents motifs et pour ex\u00e9cuter le code de mani\u00e8re conditionnelle selon le type de variable et ses attributs.\n<h3 class=\"wp-block-heading\">Utilisation du filtrage par motif avec les valeurs bool\u00e9ennes<\/h3>\nIl est fr\u00e9quent de lire et d&#8217;\u00e9crire du code dont la sortie varie selon qu&#8217;une variable <code>bol\u00e9enne<\/code> a la valeur <code>true<\/code> ou <code>false<\/code>. Par exemple, dans le code suivant, la m\u00e9thode <code>calculateDiscount<\/code> calcule et renvoie une valeur de r\u00e9duction (discount) diff\u00e9rente selon que vous passez <code>true<\/code> ou <code>false<\/code> au param\u00e8tre de m\u00e9thode <code>isPremiumMember<\/code>\u00a0:\n<pre class=\"EnlighterJSRAW\">public class DiscountCalculator {\n    private static final int PREMIUM_DISCOUNT_PERCENTAGE = 20;\n    private static final int REGULAR_DISCOUNT_PERCENTAGE = 5;\n\n    public int calculateDiscount(boolean isPremiumMember, int totalAmount) {\n        int discount;\n        if (isPremiumMember) {\n            \/\/ Calculate discount for premium members\n            discount = (totalAmount * PREMIUM_DISCOUNT_PERCENTAGE) \/ 100;\n        } else {\n            \/\/ Calculate discount for regular members\n            discount = (totalAmount * REGULAR_DISCOUNT_PERCENTAGE) \/ 100;\n        }\n        return discount;\n    }\n}<\/pre>\nAu lieu d&#8217;utiliser une construction if-else, vous pouvez changer la valeur du param\u00e8tre de la m\u00e9thode bool\u00e9ene <code>isPremiumMember<\/code> sans que la d\u00e9finition de la variable locale <code>discount<\/code> ne soit requise, comme ci-dessous\u00a0:\n<pre class=\"EnlighterJSRAW\">public int calculateDiscount(boolean isPremiumMember, int totalAmount) {\n    return switch (isPremiumMember) {\n        case true -&gt; (totalAmount * PREMIUM_DISCOUNT_PERCENTAGE) \/ 100;\n        case false -&gt; (totalAmount * REGULAR_DISCOUNT_PERCENTAGE) \/ 100;\n    };\n}<\/pre>\nL&#8217;expression switch dans la m\u00e9thode <code>calculateDiscount()<\/code> \u00e9tant exhaustive, s&#8217;il vous manque l&#8217;une des valeurs true ou false, IntelliJ IDEA peut le d\u00e9tecter et vous sugg\u00e8rera d&#8217;ins\u00e9rer une valeur par d\u00e9faut ou la casse true\/false manquante, comme le montre le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXfo-cmyg-6_ZWAXKBN5_TwpWGOZ4SnlsU_YOvD1M9lsr8URH0VpnyEbTaWpbL_3YVUKr8IMfSOecfo0YH-JAPcfYRe2sNHc4mDTD3Yfv8W5zmY06WIPAh8HHry1YlUqd2074PkwTPCNzJn8lF5MQtcNQZu-1.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Utilisation des types primitifs avec l&#8217;op\u00e9rateur instanceof<\/h3>\nAvant Java 23, aucun type primitif ne pouvait \u00eatre utilis\u00e9 avec l&#8217;op\u00e9rateur instanceof.\n\nL&#8217;op\u00e9rateur instanceof peut \u00eatre utilis\u00e9 pour v\u00e9rifier le type d&#8217;une variable et ex\u00e9cuter le code de fa\u00e7on conditionnelle. En utilisant la correspondance de motifs pour instanceof, vous pouvez \u00e9galement d\u00e9clarer et initialiser les variables de motifs si le type de la variable \u00e0 comparer correspond au motif de type, ce sans avoir besoin d&#8217;une conversion de type explicite. La variable instanceof peut \u00e9galement utiliser des motifs de garde.\n\nAvec l&#8217;ajout de types primitifs \u00e0 l&#8217;op\u00e9rateur instanceof, vous pouvez d\u00e9finir du code comme ci-dessous\u00a0:\n<pre class=\"EnlighterJSRAW\">import static java.io.IO.println;\n\nvoid main() {\n    var weight = 68;\n    if (weight instanceof byte byteWeight &amp;&amp; byteWeight &lt;= 70) {\n        println(\"Weight less than 70\");\n    }\n}<\/pre>\nNotez que la fonctionnalit\u00e9 Implicitly declared classes and instance main method de Java 23 d\u00e9finit <code>java.io.IO<\/code> avec des m\u00e9thodes statiques, ce qui vous permet de l&#8217;importer et d&#8217;utiliser <code>println()<\/code> pour renvoyer des valeurs \u00e0 la console au lieu d&#8217;utiliser <code>System.out.println()<\/code>.\n\nSi vous envisagez de v\u00e9rifier plusieurs types et conditions, vous pouvez utiliser une construction switch avec garde, comme ci-dessous\u00a0:\n<pre class=\"EnlighterJSRAW\">var weight = 68;\n\nswitch (weight) {\n    case byte b when b  println(\"byte: less than 70\");\n    case int i  when i  println(\"int: less than 7000\");\n    case long l when l &gt;= 7_000 &amp;&amp; l  println(\"long range: 7_000 - 70_000\");\n    case double d                               -&gt; println(\"double\");\n}<\/pre>\n<h3 class=\"wp-block-heading\">Conversion s\u00fbre entre les types de donn\u00e9es<\/h3>\nLorsque vous utilisez la correspondance de motifs avec des types de donn\u00e9es primitifs, le compilateur Java assure qu&#8217;il n&#8217;y ait pas de perte d&#8217;informations. Dans l&#8217;exemple suivant, l&#8217;op\u00e9rateur instanceof peut effectuer la conversion entre les types de donn\u00e9es double et byte lorsqu&#8217;il d\u00e9tecte que cela ne posera aucun probl\u00e8me\u00a0:\n<pre class=\"EnlighterJSRAW\">double height = 67;\n\nif (height instanceof byte byteHeight)\n    System.out.println(byteHeight);<\/pre>\nDu code similaire ne s&#8217;ex\u00e9cuterait pas sans un op\u00e9rateur instanceof. Le code suivant ne sera pas compil\u00e9 :\n<pre class=\"EnlighterJSRAW\">double height = 67;\n\nfinal byte convertToByte = height;<\/pre>\n<h3 class=\"wp-block-heading\">Analyse robuste du flux de donn\u00e9es dans IntelliJ IDEA<\/h3>\nIntelliJ IDEA fournit une prise en charge robuste pour les types primitifs dans les instructions switch et int\u00e8gre \u00e9galement une analyse avanc\u00e9e du flux de donn\u00e9es afin d&#8217;aider les d\u00e9veloppeurs \u00e0 \u00e9viter les probl\u00e8mes les plus courants. Comme le montre l&#8217;exemple suivant, l&#8217;analyse du flux de donn\u00e9es dans IntelliJ IDEA permet de d\u00e9terminer que la deuxi\u00e8me \u00e9tiquette case, \u00e0 savoir case int _, et le reste des \u00e9tiquettes case ne sont pas atteignables, le code sortant de la m\u00e9thode si la valeur de la variable weight est sup\u00e9rieure \u00e0 70. IntelliJ IDEA vous signale le code inaccessible et vous fournit des suggestions appropri\u00e9es :\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXfIiOIowbchc6MejIHAS6kOmegYOlXjiszQxeqJYel63cVceAp9VV-CaKzu5h2sjBuXt-ImC6lV5mbxbS0Gpbx_7uQiMut1apJBdhCwBZTpU0O2QXfxDAbAdMjd_7nQ8ol-JHZN1dYed0jXxMihOCOgKFwJ-1.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Records et composants des types de donn\u00e9es primitifs<\/h3>\nSupposons que vous d\u00e9finissiez un record Person de la fa\u00e7on suivante\u00a0:\n<pre class=\"EnlighterJSRAW\">record Person(String name, double weight) {}<\/pre>\nJusqu&#8217;\u00e0 pr\u00e9sent, vous pouviez le d\u00e9composer en types de donn\u00e9es exacts. Cependant, les types primitifs dans les correspondances de motifs permettent d&#8217;utiliser d&#8217;autres types de donn\u00e9es compatibles, tels que int, long, etc. Voici un exemple\u00a0:\n<pre class=\"EnlighterJSRAW\">Person person = new Person(\"Java\", 672);\n\nswitch (person) {\n    case Person(String name, byte weight) -&gt; println(\"byte:\" + weight);\n    case Person(String name, int weight) -&gt; println(\"int:\"  + weight);\n    case Person(String name, double weight) -&gt; println(\"double:\" + weight);\n    case Person(String name, long weight) -&gt; println(\"long:\" + weight);\n    default -&gt; throw new IllegalStateException(\"Unexpected value: \" + person);\n}<\/pre>\nVous pouvez aussi l&#8217;utiliser avec l&#8217;op\u00e9rateur instanceof, de la fa\u00e7on suivante\u00a0:\n<pre class=\"EnlighterJSRAW\"> if (person instanceof Person(String name, byte weight)) {\n     System.out.println(\"Instanceof : \" + weight);\n }<\/pre>\n<h3 class=\"wp-block-heading\">Ce qui est pr\u00e9vu dans IntelliJ IDEA pour la prise en charge de cette fonctionnalit\u00e9<\/h3>\nLe renforcement de la prise en charge des types de donn\u00e9es primitifs dans la correspondance de motifs est en cours et inclut la possibilit\u00e9 d&#8217;utiliser l&#8217;op\u00e9rateur postfix .switch sur tous les types de donn\u00e9es primitifs pour commencer \u00e0 \u00e9crire une construction switch. Il sera \u00e9galement possible de convertir une instruction if-else existante en construction switch utilisant des types de donn\u00e9es primitifs, ce qui facilitera consid\u00e9rablement l&#8217;adoption de cette nouvelle fonctionnalit\u00e9.\n<h2 class=\"wp-block-heading\">Commentaires de documentation Markdown (fonctionnalit\u00e9 de production)<\/h2>\nJusqu&#8217;\u00e0 maintenant, les commentaires de documentation Java \u00e9taient \u00e9crits avec des balises HTML et JavaDoc. Avec la nouvelle fonctionnalit\u00e9 Documentation comments, vous pourrez \u00e9galement utiliser Markdown pour \u00e9crire des commentaires JavaDoc. Avec Java 23, il s&#8217;agit d&#8217;une fonctionnalit\u00e9 de production.\n\nVous vous demandez peut-\u00eatre quelle est la raison de ce changement ?\n\nL&#8217;une des raisons est que le HTML, qui \u00e9tait un tr\u00e8s bon choix au moment de l&#8217;introduction de Java \u00e0 la fin des ann\u00e9es 90, n&#8217;est plus tr\u00e8s populaire chez les jeunes d\u00e9veloppeurs. L&#8217;\u00e9criture manuelle de HTML n&#8217;est pas simple. Markdown est plus simple \u00e0 \u00e9crire et \u00e0 lire, et peut \u00eatre facilement converti en code HTML. De nombreux d\u00e9veloppeurs utilisent maintenant Markdown pour documenter leur code, \u00e9crire des contenus tels que des articles et g\u00e9n\u00e9rer des pages de sites web, entre autres.\n\nNous allons voir comment vous pouvez utiliser Markdown pour \u00e9crire des commentaires Javadoc dans votre fichier de code source et comment IntelliJ IDEA peut vous y aider.\n<h3 class=\"wp-block-heading\">Un exemple<\/h3>\nLes commentaires de documentation Markdown commencent par \/\/\/.\n\nLe choix des trois barres obliques inverses est int\u00e9ressant. Jonathan Gibbons, responsable de cette fonctionnalit\u00e9 chez Oracle, indique que modifier la syntaxe des fonctionnalit\u00e9s du langage Java n&#8217;est pas une t\u00e2che facile. Les commentaires multilignes commencent par \/* et se terminent par *\/, ce qui rend difficile d&#8217;ins\u00e9rer dans la documentation du code qui incluerait *\/. C&#8217;est pourquoi les commentaires de documentation Markdown commencent par \/\/\/.\n\nL&#8217;ancienne fa\u00e7on d&#8217;\u00e9crire des commentaires de documentation, avec des balises HTML et JavaDoc, est \u00e9galement prise en charge. Jonathan mentionne aussi qu&#8217;il n&#8217;est pas possible de convertir des balises JavaDoc en un \u00e9quivalent en Markdown. Les d\u00e9veloppeurs peuvent donc utiliser une combinaison de commentaires Markdown et de balises JavaDoc pour b\u00e9n\u00e9ficier des avantages de chacune de ces approches.\n\nVoici un exemple d&#8217;utilisation de balises Markdown et Javadoc pour documenter une m\u00e9thode\u00a0:\n<pre class=\"EnlighterJSRAW\">\/\/\/\n\/\/\/ **Getting started and having fun learning Java :)**\n\/\/\/\n\/\/\/ Prints a pattern of the letter 'P' using the specified character.\n\/\/\/\n\/\/\/ @param size the size of the pattern\n\/\/\/ @param charToPrint the character to use for the pattern\n\/\/\/\nprivate void printP(int size, char charToPrint) {\n    for (int i = 0; i &lt; size; i++) {\n        for (int j = 0; j &lt; size; j++) {\n            if (j == 0 || (i == 0 || i == size \/ 2) &amp;&amp; j &lt; size - 1 || (j == size - 1 &amp;&amp; i &lt;= size \/ 2)) {\n                System.out.print(charToPrint + \" \");\n            } else {\n                System.out.print(\"  \");\n            }\n        }\n        System.out.println();\n    }\n}<\/pre>\nIntelliJ IDEA vous aide \u00e0 passer d&#8217;une vue \u00e0 l&#8217;autre dans l&#8217;\u00e9diteur et \u00e0 v\u00e9rifier comment les commentaires de documentation appara\u00eetraient pour leurs lecteurs potentiels.\n<h3 class=\"wp-block-heading\">Visualiser les commentaires de documentation Java dans IntelliJ IDEA<\/h3>\nJonathan Gibbons, responsable de la JEP \u00ab Markdown Documentation Comments \u00bb insiste sur la n\u00e9cessit\u00e9 pour tous les d\u00e9veloppeurs de v\u00e9rifier que les commentaires de documentation Java qu&#8217;ils ont ajout\u00e9s \u00e0 leur base de code sont corrects.\n\nIntelliJ IDEA fournit un \u00ab\u00a0mode Lecteur\u00a0\u00bb qui vous permet de visualiser les commentaires de documentation Java dans votre code source. Vous pouvez aussi basculer entre les commentaires de documentation relatifs au code Java et la vue de la fa\u00e7on dont est affich\u00e9e la documentation en utilisant la fonctionnalit\u00e9 \u00ab\u00a0Toggle Rendered View\u00a0\u00bb, comme dans le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXeXLb2pLt4iUvvpKMZ6j12PnW9UwSL8Ye-WYcM5xoO2W2wLj3sxZXH0wjAw1PUEnGA-exeh0mNk6lwrEh5fjTZ_23jwuvBDkh69UrWHM0kWmxwXFVwKMFcwgme90tCPNOE9NbzUWJIcSt6lZqggPOc6D38-1.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">\u00c9crire des commentaires de documentation Markdown dans IntelliJ IDEA<\/h3>\nIntelliJ IDEA est capable de d\u00e9tecter l&#8217;utilisation de Markdown pour documenter une m\u00e9thode. Lorsque vous commencez par \/\/\/ et appuyez sur Entr\u00e9e, il ajoute \/\/\/ sur la ligne suivante, comme illustr\u00e9 dans le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXfs4TJLosxwlJfLp6hoOGza01Q2RQPe_b-xinnHjk58RaVJXxKen1ijNWvcc-d-qmXOcOS2cGpe669c9xYxjHScHLulypwAKTpS1GulKx3gLFXz3VZTpYzDukTUKd2xoynQPbstA-R9lVXQFIfmvu6iQi3G-1.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Devez-vous convertir vos commentaires de documentation existants pour utiliser Markdown ?<\/h3>\nVoici un GIF montrant la documentation de la m\u00e9thode hashCode \u00e9crite avec Markdown dans IntelliJ IDEA. En s\u00e9lectionnant \u00ab\u00a0Toggle Rendered View\u00a0\u00bb vous pouvez facilement visualiser la documentation dans la vue Lecteur, ce qui facilite la lecture et la compr\u00e9hension.\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXd9-bsW4KVDGysZm1hAP6FfLmrdQN_Fd5uDV01SebCu5x3dI3DNQcaBrAW05tL93Jvw6mBmBpwsowRgpt3e4BTU3DD_qizckM-IpQzSyEr-CwNY7S_Jpu7LdBMMDSVmO-kfwmAgr4LGnpsFXuVBGufMPkTO-1.gif\" alt=\"\" \/><\/figure>\nDans l&#8217;id\u00e9al, je d\u00e9conseille de convertir votre documentation existante pour utiliser Markdown, sauf si vos d\u00e9veloppeurs ou utilisateurs d&#8217;API rencontrent des probl\u00e8mes de lisibilit\u00e9 majeurs lorsqu&#8217;ils consultent votre base de code (API, biblioth\u00e8ques, framework) en utilisant des outils n&#8217;offrant pas de vue alternative, contrairement \u00e0 IntelliJ IDEA.\n<h1 class=\"wp-block-heading\">D\u00e9clarations d&#8217;importation de module (fonctionnalit\u00e9 preview)<\/h1>\nCette fonctionnalit\u00e9 permet d&#8217;importer une biblioth\u00e8que de modules comme l&#8217;API Java dans votre classe ou interface en utilisant une seule instruction, telle qu&#8217;import module java.base, qui importera tous les paquets qui sont export\u00e9s par le module java.base.\n\nVous n&#8217;avez pas besoin d&#8217;instructions d&#8217;importation distinctes pour importer des paquets tels que java.util ou java.io dans votre classe, car ils sont export\u00e9s par java.base.\n<h3 class=\"wp-block-heading\">Exemple<\/h3>\nL&#8217;exemple de code suivant utilise les classes des paquets java.io et java.util. En incluant l&#8217;instruction \u00ab\u00a0import java.base\u00a0\u00bb, vous n&#8217;avez pas besoin d&#8217;importer les paquets java.io et java.util individuellement, car ils sont export\u00e9s par le module java.base\u00a0:\n<pre class=\"EnlighterJSRAW\">import module java.base;\npublic class ImportModuleHelloWorld {\n\n    public static void main(String[] args) {\n\n        try {\n            InputStream inputStream = new BufferedInputStream(\n                                            new FileInputStream(\n                                                   new File(\"abc.txt\")));\n        } catch (FileNotFoundException e) {\n            throw new RuntimeException(e);\n        }\n\n        Map list = new HashMap();\n    }\n}<\/pre>\nCependant, si vous supprimez l&#8217;instruction d&#8217;importation de module de la partie sup\u00e9rieure, IntelliJ IDEA importera des classes et des interfaces individuelles depuis les paquets java.io et java.util. Vous pouvez voir cela dans le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXeoU1a0zBzUMSB2Yjj0fRHkQmeOSMHCZRtqr9rAk99Ml5HezCAskdPyzFkNP2oLkuduWAbNh9ZKfZEizXyP_yXf9Fye4BDo3P0j72Ou8wf39JanASqnZ4GoH8t-BMnr4OwktA1IU0YIyqRiOGcP5mU2dLk-1.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Quels paquets sont export\u00e9s par le module java.base (ou d&#8217;autres modules) ?<\/h3>\nLa r\u00e9ponse \u00e0 cette question est simple lorsqu&#8217;on utilise IntelliJ IDEA. Cliquez sur le nom du module dans l&#8217;\u00e9diteur ou utilisez le raccourci correspondant (Go to Declaration ou Usages) afin de pouvoir visualiser la d\u00e9finition de ce module et d&#8217;identifier tous les modules qu&#8217;il exporte. Vous pouvez voir cela dans le GIF suivant\u00a0:\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXc1QcH3iuODtSGZwueYBpiDPxGMuoz11s65uhJHn1ix7KyZwL-xKQ0O9st0DqYe1IjDNdwFb7Mz6KHplhQIR9qrRuLtltWNZ_VHoV0GNg_UordyMC9or9lsM7BgbcZXw6KTUdpmGrtURx8LPkTiWqTSsyoV-2.gif\" alt=\"\" \/><\/figure>\n<h2 class=\"wp-block-heading\">Classes d\u00e9clar\u00e9es implicites et m\u00e9thodes d&#8217;instance Main (troisi\u00e8me preview)<\/h2>\nIntroduite en tant que fonctionnalit\u00e9 preview avec Java 21, <a href=\"https:\/\/openjdk.org\/jeps\/477\" target=\"_blank\" rel=\"noopener\">cette fonctionnalit\u00e9<\/a> en est \u00e0 sa troisi\u00e8me preview avec Java 23.\n\nElle est l\u00e0 pour changer la fa\u00e7on dont les nouveaux d\u00e9veloppeurs commencent \u00e0 apprendre Java. Elle simplifie les \u00e9tapes initiales pour les \u00e9tudiants qui comment \u00e0 apprendre les bases du langage, telles que l&#8217;affectation des variables, les s\u00e9quences, les conditions et l&#8217;it\u00e9ration. Ils n&#8217;ont ainsi plus \u00e0 d\u00e9clarer une classe explicite pour d\u00e9velopper leur code, ni \u00e0 \u00e9crire leur m\u00e9thode main() avec la signature public static void main(String []). Avec cette fonctionnalit\u00e9, les classes peuvent \u00eatre d\u00e9clar\u00e9es de fa\u00e7on implicite et la m\u00e9thode <em>main()<\/em> peut \u00eatre cr\u00e9\u00e9e avec un nombre de mots-cl\u00e9s moins important.\n\nSi vous d\u00e9couvrez cette fonctionnalit\u00e9, je vous invite \u00e0 consulter mon article <a href=\"https:\/\/blog.jetbrains.com\/idea\/2024\/02\/helloworld-and-main-meet-minimalistic\/\">\u2018HelloWorld\u2019 and \u2018main()\u2019 meet minimalistic<\/a> pour en savoir plus. Dans cette section, je vais \u00e9voquer les ajouts faits \u00e0 cette fonctionnalit\u00e9 en Java 23.\n<h3 class=\"wp-block-heading\">Utiliser des paquets export\u00e9s par le module java.base sans les importer explicitement<\/h3>\nEn incluant une seule d\u00e9claration d&#8217;importation, \u00e0 savoir import module java.base, en haut de votre classe implicite, vous pouvez importer automatiquement les paquets export\u00e9s par java.base. Votre classe implicite n&#8217;a plus besoin d&#8217;instructions d&#8217;importation individuelles pour ces classes ou paquets, comme le montre le GIF suivant :\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXeUQmI7dMm_erag285CAfYoLvqOUkj0JZy137sMYfF8PaQRXAa7V2magfhFDzwAhreCMLFUOCnHq-SxcVmF6QZlY00EaXVMYtuZ4avZ0umRitxl4WUdys92_p_KKM1aptN8eQnqTCWpZMueT2QJHLyT3xY-2.gif\" alt=\"\" \/><\/figure>\n<h3 class=\"wp-block-heading\">Simplifier l&#8217;\u00e9criture du code pour interagir avec la console<\/h3>\nInteraction avec la console\u00a0: l&#8217;impression ou la consommation de messages est l&#8217;une des actions les plus fr\u00e9quemment utilis\u00e9es par les nouveaux d\u00e9veloppeurs Java. Cela a \u00e9t\u00e9 encore simplifi\u00e9 avec cette fonctionnalit\u00e9.\n\nLes classes que vous avez d\u00e9clar\u00e9es implicitement peuvent utiliser les m\u00e9thodes println() et print() pour afficher des messages sur la console et la m\u00e9thode readln() pour lire des messages sous forme de cha\u00eene sans les importer explicitement dans votre classe. Toutes ces m\u00e9thodes sont d\u00e9clar\u00e9es dans une nouvelle classe de niveau sup\u00e9rieur, <a href=\"https:\/\/cr.openjdk.org\/~prappo\/8305457\/java.base\/java\/io\/IO.html\" target=\"_blank\" rel=\"noopener\">java.io.IO<\/a>, qui est import\u00e9e implicitement par les classes implicites.\n\nLa fa\u00e7on dont vous devez les importer explicitement dans une classe normale est illustr\u00e9e dans le GIF suivant :\n\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXfHsqSnLnP3_hHYUa4JDTeuCl2cyQ1XsmIcaMbqh7wCEpzjcEYf1PTgZ0rFfH4FX_C-8IzBypWdmiqE6yHB-jgdbgxgpHfd53Q0QT_NZw1k2gclRzwJpuzBG_OZ9rWgJel99-4loZbY-qCYWMv4zwYtRmTI-2.gif\" width=\"624\" height=\"487\" \/>\n\nLe GIF montre que vous n&#8217;avez pas besoin d&#8217;importations explicites lorsque vous utilisez les m\u00eames m\u00e9thodes pr\u00e9c\u00e9dentes dans une classe implicite\u00a0:\n\n<img decoding=\"async\" loading=\"lazy\" src=\"https:\/\/blog.jetbrains.com\/wp-content\/uploads\/2025\/09\/AD_4nXcw2gC_nGhTB8PGkTk3Td1JtHdn-EZd317WgLyrQSWbrSba0w6jqH6JdVL8YXPWNeH6IPL6TmNr0SYZF4TF5jgAyfSlyv24xYPa1nIKRMgYhuCmc9nH4OFRUIIxs229mQxeh6ZT6Oec_97TSBLFeFk0gYt-2.gif\" width=\"624\" height=\"487\" \/>\n<h1 class=\"wp-block-heading\">Corps de constructeur flexibles (deuxi\u00e8me preview)<\/h1>\nIl s&#8217;agit de la deuxi\u00e8me preview d&#8217;une fonctionnalit\u00e9 du JDK 22, appel\u00e9e auparavant \u00ab Statements before super() \u00bb. Au-del\u00e0 de ce changement de nom, cette fonctionnalit\u00e9 a fait l&#8217;objet d&#8217;une modification importante. Il est d\u00e9sormais possible d&#8217;initialiser les champs avant d&#8217;appeler super() ou this(), ce qui s&#8217;av\u00e8re utile lorsqu&#8217;une superclasse appelle une m\u00e9thode depuis son constructeur et que vous voulez remplacer cette m\u00e9thode dans une sous-classe et acc\u00e9der \u00e0 un champ depuis la sous-classe dans cette m\u00e9thode. Auparavant, le champ subclass n&#8217;\u00e9tait pas initialis\u00e9 lorsque la m\u00e9thode \u00e9tait appel\u00e9e depuis le constructeur superclass. Il est d\u00e9sormais possible d&#8217;initialiser le champ et d&#8217;\u00e9viter les surprises. Voici un exemple de code illustrant cette fonctionnalit\u00e9 :\n<pre class=\"EnlighterJSRAW\">abstract class Action {\n    public Action() {\n        System.out.println(\"performing \" + getText());\n    }\n    public abstract String getText();\n}\n\nclass DoubleAction extends Action {\n    private final String text;\n    private DoubleAction(String text) {\n        this.text = text; \/\/ this did not compile before Java 23 with preview features enabled.\n        super();\n    }\n\n    @Override public String getText() {\n        return text + text;\n    }\n}<\/pre>\nSi vous d\u00e9couvrez cette fonctionnalit\u00e9, je vous invite \u00e0 consulter l&#8217;article que je lui ai consacr\u00e9, qui explique pourquoi et comment l&#8217;utiliser : <a href=\"https:\/\/blog.jetbrains.com\/idea\/2024\/02\/constructor-makeover-in-java-22\/\">https:\/\/blog.jetbrains.com\/idea\/2024\/02\/constructor-makeover-in-java-22\/<\/a>.\n<h2>Fonctionnalit\u00e9s preview<\/h2>\n<!-- \/wp:heading -->\n\n<!-- wp:paragraph -->\n\nLes fonctionnalit\u00e9s pr\u00e9sent\u00e9es dans cet article, \u00ab types primitifs dans les motifs, instanceof et switch \u00bb, \u00ab d\u00e9clarations d&#8217;importation de module \u00bb, \u00ab classes d\u00e9clar\u00e9es implicitement et m\u00e9thodes d&#8217;instance main \u00bb et \u00ab corps de constructeur flexibles \u00bb, sont toutes des fonctionnalit\u00e9s preview en Java 23. Avec un nouveau cycle de publication de six mois, les nouvelles fonctionnalit\u00e9s du langage sont fournies en version preview. Elles peuvent \u00eatre r\u00e9introduites ult\u00e9rieurement dans les versions de Java en tant que seconde preview ou plus, avec ou sans modifications. Une fois qu&#8217;elles sont suffisamment stables, elles peuvent \u00eatre ajout\u00e9es \u00e0 Java en tant que fonctionnalit\u00e9 standard du langage.\n\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n\nLes fonctionnalit\u00e9s preview du langage sont compl\u00e8tes, mais pas permanentes, ce qui signifie essentiellement qu&#8217;elles sont pr\u00eates \u00e0 \u00eatre utilis\u00e9es par des d\u00e9veloppeurs, m\u00eame si certains d\u00e9tails peuvent \u00e9voluer au fil des nouvelles versions de Java sur la base des retours des d\u00e9veloppeurs. Contrairement \u00e0 une API, les fonctionnalit\u00e9s de langage ne peuvent plus devenir obsol\u00e8tes. Par cons\u00e9quent, si vous avez des commentaires sur l&#8217;une des versions preview des fonctionnalit\u00e9s du langage, n&#8217;h\u00e9sitez pas \u00e0 les partager via la mailing list de JDK (inscription gratuite requise).\n\n<!-- \/wp:paragraph -->\n\n<!-- wp:paragraph -->\n\nEn raison du mode de fonctionnement de ces fonctionnalit\u00e9s, IntelliJ IDEA ne prend en charge que les fonctionnalit\u00e9s preview de la version actuelle de JDK. Les fonctionnalit\u00e9s en mode preview du langage peuvent varier selon les versions de Java, jusqu&#8217;\u00e0 ce qu&#8217;elles soient abandonn\u00e9es ou ajout\u00e9es en tant que fonctionnalit\u00e9s standard. Le code utilisant une fonctionnalit\u00e9 preview d&#8217;une version plus ancienne de Java SE Platform risque de pas \u00eatre compil\u00e9 ou ex\u00e9cut\u00e9 sur une version plus r\u00e9cente.\n<h2>R\u00e9sum\u00e9<\/h2>\nDans cet article de blog j&#8217;ai couvert cinq fonctionnalit\u00e9s Java 23\u00a0: <a href=\"https:\/\/openjdk.org\/jeps\/455\" target=\"_blank\" rel=\"noopener\">types primitifs dans les motifs, instanceof et switch<\/a>, <a href=\"https:\/\/openjdk.org\/jeps\/467\" target=\"_blank\" rel=\"noopener\">commentaires de documentation Markdown<\/a>, <a href=\"https:\/\/openjdk.org\/jeps\/476\" target=\"_blank\" rel=\"noopener\">d\u00e9clarations d&#8217;importation de module<\/a>, <a href=\"https:\/\/openjdk.org\/jeps\/477\" target=\"_blank\" rel=\"noopener\">classes d\u00e9clar\u00e9es implicites et m\u00e9thodes d&#8217;instance main<\/a> et <a href=\"https:\/\/openjdk.org\/jeps\/482\" target=\"_blank\" rel=\"noopener\">corps de constructeur flexibles<\/a>.\n\nJe vous invite \u00e0 les essayer pour d\u00e9couvrir comment elles peuvent vous aider \u00e0 am\u00e9liorer vos applications.\n\nBon d\u00e9veloppement\u00a0!","protected":false},"author":813,"featured_media":510392,"comment_status":"closed","ping_status":"closed","template":"","categories":[4759,5088],"tags":[3374,155,8568,76,8582],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/idea\/519757"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/idea"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/types\/idea"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/users\/813"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/comments?post=519757"}],"version-history":[{"count":9,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/idea\/519757\/revisions"}],"predecessor-version":[{"id":610142,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/idea\/519757\/revisions\/610142"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media\/510392"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/media?parent=519757"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/categories?post=519757"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/tags?post=519757"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/fr\/wp-json\/wp\/v2\/cross-post-tag?post=519757"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}