Я бачу, що @Nullable
і @Nonnull
примітки можуть бути корисними для запобігання NullPointerException
s, але вони не дуже поширені.
- Ефективність цих анотацій повністю знижується після одного рівня непрямості, тому якщо ви додасте лише кілька, вони не розповсюджуються дуже далеко.
- Оскільки ці анотації не виконуються належним чином, існує небезпека припустити, що значення, позначене символом
@Nonnull
не є нульовим, і, отже, не виконує перевірку нуля.
Наведений нижче код викликає параметр зазначений @Nonnull
бути null
без підвищення яких - або скарг. Він кидає, NullPointerException
коли він запущений.
public class Clazz {
public static void main(String[] args){
Clazz clazz = new Clazz();
// this line raises a complaint with the IDE (IntelliJ 11)
clazz.directPathToA(null);
// this line does not
clazz.indirectPathToA(null);
}
public void indirectPathToA(Integer y){
directPathToA(y);
}
public void directPathToA(@Nonnull Integer x){
x.toString(); // do stuff to x
}
}
Чи є спосіб зробити ці примітки більш чіткими та / або поширюватись далі?
@Nonnull
виклику для виклику @Nonnull
методу із змінною змінною. Звичайно, в Java 7 неможлива трансляція з анотацією, але Java 8 додасть можливість застосовувати примітки до використання змінної, включаючи касти. Тож це можливо стане можливим втілити в Java 8.
(@NonNull Integer) y
синтаксично можливий, але компілятору заборонено видавати будь-який конкретний байт-код на основі анотації. Для тверджень під час виконання достатньо невеликих допоміжних методів, як обговорювалося в bugs.eclipse.org/442103 (наприклад, directPathToA(assertNonNull(y))
) - але зауважте, це лише допомагає швидко провалитися. Єдиний безпечний спосіб - це виконати фактичну нульову перевірку (плюс, сподіваємось, альтернативну реалізацію в іншій галузі).
@Nonnull
і @Nullable
ви говорите, оскільки існує кілька подібних приміток (див. Це запитання ). Ви говорите про примітки в пакеті javax.annotation
?
@Nullable
або@Nonnull
, але якщо вони варті, дуже "ймовірно вимагати дебатів"