2014-12-24 5 views
4

Я думаю использовать аннотацию @Nonnull, представленную в javax.annotaiton.Nonnull, которая имеет политику хранения как время выполнения. С помощью этой аннотации я хочу, чтобы эта функция никогда не возвращалась к null. Я хотел бы поставить пометку на интерфейс, так что никаких будущих реализаций брейки не существующий код следующимТребуется использовать аннотацию при реализации, когда уже указано на интерфейсе

public interface X { 
    @Nonnull public List<A> func(); 
} 

Теперь то, что я не понимаю, что я должен использовать ту же аннотацию на реализацию, а также. Итак, какой один из перечисленных ниже будет правильный путь, чтобы написать реализацию этого интерфейса (оба этих компиляцией):

public class XImpl implements X { 
    @Override 
    @Nonnull public List<A> func() { 
     //code 
    } 
} 

Или

public class XImpl implements X { 
    @Override 
    public List<A> func() { 
     //code 
    } 
} 
+0

Возможный дубликат [Аннотации на интерфейсах?] (Http://stackoverflow.com/questions/146391/annotations-on-interfaces) –

+0

@RomanC Нет. Я хочу использовать аннотации. Но вопрос в том, должен ли я использовать его для реализации, чтобы обеспечить его выполнение, или компилятор позаботится об этом. Было бы здорово, если бы кто-то мог пролить свет на 'how', а также –

+0

Если вы хотите узнать, где использовать аннотацию, проверьте исходный код. –

ответ

3

Как правило, вы должны смотреть на документацию аннотацию по , К сожалению, javax.annotation.Nonnull annotation не содержит документации (!). Аннотации были предложены JSR 305, но с тех пор JSR 305 был оставлен. JSR 305 не давал семантики и не давал ссылочной реализации.

Вы хотите обработать аннотацию некоторым инструментом, например Checker Framework или FindBugs. Чтобы понять, следует ли писать аннотацию на реализацию в дополнение к интерфейсу, вам нужно будет посмотреть документацию для инструмента.

Checker Framework manual говорит, что вам нужно написать аннотацию как по реализации, так и по интерфейсу. Это дает лучшую документацию, так как вы можете понять ее реализацию самостоятельно, не перечитывая интерфейс.

Руководство FindBugs не содержит слова «наследуют», ни «наследство», и messagestothe в список рассылки о аннотаций и наследования не были услышаны. FindBugs обрабатывает некоторые аннотации, такие как CheckReturnValue, как унаследованные, но вы, похоже, не имеете никаких гарантий относительно текущего или будущего поведения @Nonnull. Я рекомендую писать аннотацию явно, что должно быть безопасным и имеет преимущества для документации, отмеченные выше.

Смежные вопросы