С помощью комбинации @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 - Введите , чтобы вызвать всплывающее окно с намерениями.
- Выберите «Добавить метод контракта».
- Использовать текст договора
false -> fail
.
- При появлении запроса укажите местоположение для файла внешних аннотаций.
Теперь предупреждение на 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>
См. Также