Хотя я думаю, что должно быть общее правило для наследования аннотаций или нет, я особенно заинтересован в том, чтобы FindBugs распознавал мои правила, поэтому этот вопрос специфичен для FindBugs.

AFAIK, комментарии JavaDoc берутся из интерфейса и игнорируются при реализации. Применяется ли эта концепция также к аннотациям, таким как @Nonnull (или @NotNull)?

Учитывая аннотацию @Override, по крайней мере можно добавить дополнительные аннотации, которых нет в интерфейсе.

Что будет в следующих случаях? Узнает ли FindBugs их всех? Какой из них предпочтительнее с точки зрения чистого кода?

  1. Интерфейс @Nonnull, реализация @Override
  2. Интерфейс @Nonnull, реализация @Override, @Nonnull
  3. Интерфейс не имеет аннотации, Реализация @Override, @ Nonnull`
16
Thomas Weller 6 Мар 2015 в 11:02

2 ответа

Лучший ответ

В аннотации к интерфейсу указано, что все реализации не должны возвращать null, в то время как в реализации указано, что она подчиняется этому контракту. Он не передается по наследству, и я не думаю, что это так.

Аннотация @CheckForNull определенно не наследуется, потому что подклассам разрешено сужать неопределенность возвращаемого типа так же, как они могут расширять ее для параметров, которые они принимают.

interface Credentials {
    @NonNull
    String getPassword();

    void setPassword(@NonNull password);
}

// Allows null password
class GoodCreds implements Credentials {
    // but cannot widen; throw exception for null instead
    @Overrides
    @NonNull
    String getPassword() {...}

    // can widen parameters
    @Overrides
    void setPassword(@CheckForNull password) {...}
}

Примечание: я добавлю подходящие аксессоры имени пользователя, чтобы продемонстрировать неправильное расширение в подклассе BadCreds, когда у меня будет время позже.

4
David Harkness 7 Мар 2015 в 16:18

Выберите вариант 2:

  1. Интерфейс @Nonnull, реализация @Override @Nonnull

FindBugs и многие другие инструменты, такие как IDE, работают намного лучше, если находят аннотации в нужных местах. Эти аннотации не наследуются, как указано в JLS внизу этот раздел:

Наследование аннотаций работает только с классами (но не с методами, интерфейсами или конструкторами)

Таким образом, инструменты нужно будет искать самостоятельно. Что и делают некоторые инструменты, но даже FindBugs не делает это постоянно (последний раз я проверял).

8
barfuin 11 Мар 2015 в 00:38