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




Я использовал его в Spring для аннотирования интерфейсов, где аннотация должна применяться ко всем подклассам. Например, предположим, что у вас есть интерфейс службы, и у вас может быть несколько реализаций интерфейса, но вы хотите, чтобы аннотация безопасности применялась независимо от аннотации. В этом случае имеет смысл аннотировать интерфейс.
В частности, это @Transactional, который вы можете применить к классу bean-компонента Spring, любому из его методов или интерфейсу или методам интерфейса, которые реализует класс, в зависимости от того, что в данный момент имеет смысл.
@Alex Не уверен, что я неправильно понял ваш ответ, но, согласно этот вопрос, аннотации не наследуются от интерфейсов. Возможно, вы имеете в виду аннотирование суперклассов, а не интерфейсов?
Так можно ли переопределить аннотацию, добавив конкретный класс?
Вы можете использовать его для программирования в контрактном стиле - пойти на один шаг дальше, чем просто определить интерфейс (типы и имена методов), а также определить некоторую семантику (содержимое типов, предварительные условия, постусловия).
Мне нужно было бы проверить, как аннотации работают в 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;
}
...
}
Это отлично подходит для того, чтобы разозлить парня из JavaScript, пытающегося понять вашу Java.