Место пометки в Java
Свой тип метки по умолчанию можно ставить почти
на любое объявление. Чтобы запретить лишние места,
на @interface вешают метку @Target
со списком значений ElementType.
Если метка нужна только на методах, объявление типа ограничивают одной целью:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@interface Action {
String name();
}
Несколько целей перечисляют в фигурных скобках. Такую метку можно повесить и на класс, и на метод:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@interface Owner {
String team();
}
@Owner(team = "billing")
class InvoiceService {
@Owner(team = "billing")
void charge() {
}
}
Для полей и параметров методов используют отдельные
константы FIELD и PARAMETER. Метка
на параметре не переносится на поле класса
автоматически:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.PARAMETER)
@interface Doc {
String note();
}
class ProfileService {
void rename(@Doc(note = "public handle") String handle) {
}
}
Попытка поставить метку не на ту цель даёт ошибку
компиляции. Если @Target разрешает только
методы, подпись на классе не пройдёт проверку.
Объявите метку только для ElementType.TYPE
с элементом note. Повесьте её на класс
заказа и убедитесь, что на метод она не
ставится.
Создайте метку для FIELD и PARAMETER.
Подпишите строковое поле класса и одноимённый
параметр конструктора с разными строками.