Я бачу, що @Nullableі @Nonnullпримітки можуть бути корисними для запобігання NullPointerExceptions, але вони не дуже поширені.
- Ефективність цих анотацій повністю знижується після одного рівня непрямості, тому якщо ви додасте лише кілька, вони не розповсюджуються дуже далеко.
- Оскільки ці анотації не виконуються належним чином, існує небезпека припустити, що значення, позначене символом
@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, але якщо вони варті, дуже "ймовірно вимагати дебатів"