<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Florent Dupont</title>
    <description>The latest articles on DEV Community by Florent Dupont (@fdupont).</description>
    <link>https://dev.to/fdupont</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1316779%2Ff318cd82-4845-4ebb-ac9a-1bc22e2824bb.png</url>
      <title>DEV Community: Florent Dupont</title>
      <link>https://dev.to/fdupont</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fdupont"/>
    <language>en</language>
    <item>
      <title>@Nullable et @NonNull</title>
      <dc:creator>Florent Dupont</dc:creator>
      <pubDate>Fri, 29 Mar 2024 17:21:20 +0000</pubDate>
      <link>https://dev.to/fdupont/nullable-et-nonnull-50ci</link>
      <guid>https://dev.to/fdupont/nullable-et-nonnull-50ci</guid>
      <description>&lt;p&gt;Le &lt;a href="https://checkerframework.org/" rel="noopener noreferrer"&gt;framework Checker&lt;/a&gt; propose plein d'annotations sympa à placer dans le code pour le sécuriser.&lt;/p&gt;

&lt;p&gt;Il permet notamment de répondre au besoin de nullabilité des types (et des retours de fonction): Une fonctionnalité qui existe en Kotlin (par exemple &lt;code&gt;String?&lt;/code&gt; qui défini un String possiblement &lt;code&gt;null&lt;/code&gt;), mais qui n'existe pas en Java.&lt;/p&gt;

&lt;p&gt;L'idée derrière tout ça est évidemment de faciliter l'intéropérabilité avec Kotlin, mais pas que !&lt;/p&gt;

&lt;p&gt;En effet, les IDE sont capables de prendre en compte ces annotations et proposer des corrections de code pour éviter de potentielles erreurs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Indiquer la potentielle nullité
&lt;/h2&gt;

&lt;p&gt;Avec &lt;code&gt;@Nullable&lt;/code&gt;, une fonction pourrait retourner  &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Par exemple: &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="nd"&gt;@Nullable&lt;/span&gt;  
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;creerDossier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemandeCreationDossier&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
   &lt;span class="c1"&gt;// Dans cet exemple, la demande peut retourner null cas d'erreur métier&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creerDossier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si après le code appelant, un accès à la variable est réalisé, l'IDE nous informe que ce code peut lever une erreur et qu'il serait préférable de l'encadrer avec un test de nullité.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ghawsj9k19biu6htp5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu3ghawsj9k19biu6htp5.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Indiquer l'impossibilité de nullité
&lt;/h2&gt;

&lt;p&gt;Avec &lt;code&gt;@NonNull&lt;/code&gt;, on indique qu'une fonction est assurée de ne pas retourner  &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="nd"&gt;@NonNull&lt;/span&gt;  
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;creerDossier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;DemandeCreationDossier&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="nc"&gt;BusinessException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;  
   &lt;span class="c1"&gt;// Dans cet exemple, la demande est crée ou un BusinessException est levée en cas d'erreur métier&lt;/span&gt;
   &lt;span class="n"&gt;verifierDemande&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; 
   &lt;span class="c1"&gt;// vérification métiers, etc...&lt;/span&gt;
   &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;creerDossier&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;demande&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Si dans le code un test de nullité est réalisé, l'IDE nous informe que ce test est superflu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr42fy1pspbewcpotsejg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr42fy1pspbewcpotsejg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Et également sur les variables ...
&lt;/h2&gt;

&lt;p&gt;Evidemment cette approche fonctionne également sur les variables.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="nd"&gt;@NonNull&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;numeroDossier&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;span class="nd"&gt;@Nullable&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="n"&gt;car&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findFirstCar&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Pour aller plus loin :&lt;br&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Ces annotations ont beaucoup d'homonymes. C'est le package &lt;code&gt;org.checkerframework.checker.nullness.qual&lt;/code&gt; qu'il faut utiliser&lt;/li&gt;
&lt;li&gt;Le Checker Framework propose pleins d'autres annotations de contrôle, mais 🥱 la &lt;a href="https://checkerframework.org/manual/" rel="noopener noreferrer"&gt;doc est très spartiate&lt;/a&gt; ! &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jcp.org/en/jsr/detail?id=305" rel="noopener noreferrer"&gt;JSR 305&lt;/a&gt; qui voulait standardiser ces annotations... qui n'a malheureusement jamais été validé&lt;/li&gt;
&lt;li&gt;Bonne pratique de dev : &lt;a href="http://www.javapractices.com/topic/TopicAction.do?Id=134" rel="noopener noreferrer"&gt;Avoid Null Values if possible&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>kotlin</category>
      <category>bestpractice</category>
      <category>checkerframework</category>
    </item>
  </channel>
</rss>
