Каковы допустимые варианты использования аннотаций?
При проектировании в основном основанных на аннотации систем конфигурации мне иногда нужно создавать классы, которые реализуют аннотации для генерации кода или программной конфигурации.
Альтернатива включает зеркальное отображение данных, содержащихся в аннотациях, в DTO, что кажется накладными расходами.
Вот пример:
public enum IDType {
LOCAL,
URI,
RESOURCE;
}
@Documented
@Target( { METHOD, FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface Id {
/**
* @return
*/
IDType value() default IDType.LOCAL;
}
с реализацией
public class IdImpl implements Id{
private final IDType idType;
public IdImpl(IDType idType){
this.idType = idType;
}
@Override
public IDType value() {
return idType;
}
@Override
public Class<? extends Annotation> annotationType() {
return Id.class;
}
}
Я получаю предупреждения для компилятора для этого, но, похоже, это допустимый инструмент для многих случаев использования.
Предупреждение для приведенного выше примера
Идентификатор типа аннотации не должен быть используется как суперинтерфейс для IdImpl
Отредактировано:
Я только что нашел этот пример из Guice:
bind(CreditCardProcessor.class)
.annotatedWith(Names.named("Checkout"))
.to(CheckoutCreditCardProcessor.class);
Смотрите Javadoc из имен.
Есть ли у кого-нибудь какая-либо информация о том, почему это ограничение существует или есть какие-то другие варианты использования?