Аннотации к интерфейсам?

Я не могу понять, как использовать аннотации интерфейсов в Java.

Может, кто-нибудь может привести мне пример?

Это отлично подходит для того, чтобы разозлить парня из JavaScript, пытающегося понять вашу Java.

Erik Reppen 12.06.2013 19:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
1
29 703
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Еще пример, но аннотации Местный и Удаленный в EJB3. Согласно java-документу,

When used on an interface, designates that interface as a local business interface.

Я предполагаю, что здесь используется вариант использования в интерфейсе специальной функции, которую лучше всего обозначить аннотацией.

Ответ принят как подходящий

Я использовал его в Spring для аннотирования интерфейсов, где аннотация должна применяться ко всем подклассам. Например, предположим, что у вас есть интерфейс службы, и у вас может быть несколько реализаций интерфейса, но вы хотите, чтобы аннотация безопасности применялась независимо от аннотации. В этом случае имеет смысл аннотировать интерфейс.

В частности, это @Transactional, который вы можете применить к классу bean-компонента Spring, любому из его методов или интерфейсу или методам интерфейса, которые реализует класс, в зависимости от того, что в данный момент имеет смысл.

skaffman 29.09.2008 00:26

@Alex Не уверен, что я неправильно понял ваш ответ, но, согласно этот вопрос, аннотации не наследуются от интерфейсов. Возможно, вы имеете в виду аннотирование суперклассов, а не интерфейсов?

Steve Chambers 10.10.2014 12:56

Так можно ли переопределить аннотацию, добавив конкретный класс?

markthegrea 30.05.2019 18:01

Вы можете использовать его для программирования в контрактном стиле - пойти на один шаг дальше, чем просто определить интерфейс (типы и имена методов), а также определить некоторую семантику (содержимое типов, предварительные условия, постусловия).

Мне нужно было бы проверить, как аннотации работают в Java, но это можно легко сделать с помощью аннотаций Python ...

Я широко использую findbugs. Я считаю очень полезным использование аннотации для указания ограничений Nullity. Даже если вы на самом деле не используете findbugs, это значительно проясняет смысл кода. Эти аннотации имеют свое место как в интерфейсах, так и в классах. Вы можете возразить, что это своего рода программирование по контракту ...

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

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

Даже без примеров должно быть понятно объяснение - интерфейсы описывают поведение, а также аннотации, поэтому их объединение является логическим совпадением.

При развертывании приложений под JBoss вы можете использовать аннотации в интерфейсе для экспорта службы в jmx-console.

Я использовал его при определении интерфейса REST. RESTeasy позволяет создать REST-клиент, использующий аннотированный интерфейс (RESTInterfaceV1 в этом примере):

final RESTInterfaceV1 client = ProxyFactory.create(RESTInterfaceV1.class, "http://localhost:8080/rest");

Хотя аннотации должны быть продублированы на объекте, который фактически реализует интерфейс REST, сам интерфейс может быть распространен отдельно для тех, кто хочет создать клиент Java REST.

Я помечаю свои интерфейсы @Immutable, чтобы четко указать разработчикам подклассов, какие контракты Mutability должны иметь класс, реализующий интерфейс. Как выразился гехель, программирование по контракту.

Пример использования, с которым я работаю, - это проверка bean-компонента javax / hibernate, мы используем интерфейсы, чтобы помочь нам избежать определения проверок для каждого конкретного класса.

public interface IUser {
    @NotNull Long getUserId();
    ...
}

public class WebUser implements IUser {
    private Long userId;

    @Override
    public Long getUserId(){
        return userId;
    }
    ...
}

Другие вопросы по теме