Хотя я думаю, что должно быть общее правило для наследования аннотаций или нет, я особенно заинтересован в том, чтобы FindBugs распознавал мои правила, поэтому этот вопрос специфичен для FindBugs.
AFAIK, комментарии JavaDoc берутся из интерфейса и игнорируются при реализации. Применяется ли эта концепция также к аннотациям, таким как @Nonnull
(или @NotNull
)?
Учитывая аннотацию @Override
, по крайней мере можно добавить дополнительные аннотации, которых нет в интерфейсе.
Что будет в следующих случаях? Узнает ли FindBugs их всех? Какой из них предпочтительнее с точки зрения чистого кода?
- Интерфейс
@Nonnull
, реализация@Override
- Интерфейс
@Nonnull
, реализация@Override
,@Nonnull
- Интерфейс не имеет аннотации, Реализация
@Override,
@ Nonnull`
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
, когда у меня будет время позже.
Выберите вариант 2:
- Интерфейс @Nonnull, реализация @Override @Nonnull
FindBugs и многие другие инструменты, такие как IDE, работают намного лучше, если находят аннотации в нужных местах. Эти аннотации не наследуются, как указано в JLS внизу этот раздел:
Наследование аннотаций работает только с классами (но не с методами, интерфейсами или конструкторами)
Таким образом, инструменты нужно будет искать самостоятельно. Что и делают некоторые инструменты, но даже FindBugs не делает это постоянно (последний раз я проверял).
Похожие вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.