通过@Contract
注释和外部注释功能的组合,您现在可以注释Preconditions
方法,以便 IntelliJ 将正确的静态分析应用于对这些方法的调用。
假设我们有这个例子
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
}
}
在 IntelliJ 中(我使用的是 13):
- 导航到
Preconditions.checkArgument(boolean)
。
- 将光标放在方法名称上,然后点击Alt-Enter以弹出意图弹出窗口。
- 选择“添加方法合同”。
- 使用合同文本
false -> fail
。
- 出现提示时,提供外部注释文件的位置。
现在 at 的警告someArg.doSomethingElse()
消失了,IDEA 实际上会将if
分支标记为始终为真!
其他合同文本:
Preconditions.checkArgument(boolean, String)
应该false, _ -> fail
Preconditions.checkNotNull(Object, String)
应该null, _ -> fail
是
- 等等等等
这是我的完整annotations.xml
文件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>
也可以看看