Grâce à une combinaison de @Contract
et de la fonction Annotations externes, vous pouvez désormais annoter Preconditions
de sorte qu'IntelliJ applique l'analyse statique correcte aux appels à ces méthodes.
Disons que nous avons cet exemple
public void doSomething(Object someArg) {
Preconditions.checkArgument(someArg != null);
someArg.doSomethingElse(); //currently gives NPE warning
if (someArg != null) {
//no warning that this is always true
}
}
Dans IntelliJ (j'utilise la version 13) :
- Naviguez vers
Preconditions.checkArgument(boolean)
.
- Placez votre curseur sur le nom de la méthode, et appuyez sur Alt - Enter pour faire apparaître la fenêtre popup des intentions.
- Sélectionnez "Ajouter un contrat de méthode".
- Utiliser le texte du contrat
false -> fail
.
- Lorsque vous y êtes invité, indiquez un emplacement pour le fichier d'annotations externes.
Maintenant, l'avertissement à someArg.doSomethingElse()
disparaît, et IDEA va, en fait, signaler l' if
branche comme toujours vrai !
Autres textes contractuels :
-
Preconditions.checkArgument(boolean, String)
devrait être false, _ -> fail
-
Preconditions.checkNotNull(Object, String)
devrait être null, _ -> fail
,
- etc, etc.
Voici l'intégralité de mon annotations.xml
pour Preconditions
:
<root>
<item name='com.google.common.base.Preconditions T checkNotNull(T)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions T checkNotNull(T, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""null, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkArgument(boolean, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, java.lang.Object)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _ -> fail""/>
</annotation>
</item>
<item name='com.google.common.base.Preconditions void checkState(boolean, java.lang.String, java.lang.Object...)'>
<annotation name='org.jetbrains.annotations.Contract'>
<val val=""false, _, _ -> fail""/>
</annotation>
</item>
</root>
Voir aussi