Аннотации
Для параметров значения по умолчанию, default, могут быть только константы и не null значения. Любое значение, которое не может быть вычислено на этапе компиляции будет провоцировать ошибку компиляции:
1 | public Iface { |
В качестве параметров допускается использование только:
- Примитивы (
int,doubleи т.д.). Классы-обертки использовать запрещено! - Строки (только вычисленные на момент компиляции)
- Объекты типа
Class enum- Другие аннотации
- Массивы (типа
int[],String[]и т.д.), но не многоуровневые массивы типа (int[][],String[][])
Константы в аннотациях
Допускается. Тогда модификаторы у них будут public static final (как у интерфейсов):
1 | public Iface { |
Области применения аннотаций
Допускается к применению с:
- Классы, интерфейсы, enum, модули;
- Переменные (static, instance, local);
- Методы и конструкторы; так же, любые их параметры;
- Другие аннотации;
- Наложение аннотаций при type-cast:
1 | String fruit = ( String) "mango"; |
@Target
Ограничивает область применения аннотации. Принимает объект ElementType следующих типов:
TYPE-class,interface,enum,@interface;FIELD- параметры класса, статические переменные, значения вenum;METHOD- методы (только);PARAMETER- параметры методов, конструкторов и лямбд;CONSTRUCTOR- только конструкторы;PACKAGE- аннотации на пакет;TYPE_PARAMETER- параметризованные типы,; MODULE- модули;ANNOTATION_TYPE- где угодно, где может участвовать Java тип. Может быть довольно противоречивым;LOCAL_VARIABLE- аннотация доступа только на этапе компиляции. В runtime не будет найдена и прочитана.
@Retention
Ограничение на момент жизни аннотации:
SOURCE- доступна только в исходном коде. При компиляции будет удалена;CLASS- хранится в скомпилированном *.class, но в момент выполнения программы недоступна;RUNTIME- доступна всегда. По умолчанию.
SOURCE следует использовать если аннотируемая реализация фактически не будет использована и следует ее расширять, или как какой-нибудь маркер; CLASS используется для учета классов, аннотированных чем-либо; RUNTIME - стандартные случаи.
@Documented
Требует ведения JavaDoc для структур языка - class, interface, enum или @interface.
@Inherited
Указывает что наследуемые (дочерние) классы будут полностью перенимать все свойства данной аннотации:
1 |
|
@Repeatable
Позволяет присваивать несколько одинаковых аннотаций одному объекту.
1 |
|
Старый способ добавления нескольких аннотаций так же допустим, но не рекомендуется:
1 | public AnnotationsContainer { |
@Override
Накладывается на метод и требует ту же сигнатуру, тот же модификатор доступа (без него метод может расширить его), совместимый тип результата, отсутствие checked исключений, которого нет у родительского метода.
Метод будет де-факто, итак перезаписан, если все вышеуказанные условия сохранятся, но в случае малейшего расхождения, компилятором будет выдана ошибка.
@Deprecated
Позволяет добавлять предупреждения (warning), указываемые компилятором. В случае установки, рекомендуется в JavaDoc указывать причину и версию, начиная с которой использование будет прекращено.
1 | /** |
@SuppressWarnings
Отключает предупреждения (warning) компилятора для класса, метода, переменной и т.д. Используя определенные модификаторы для отключения того или иного типа предупреждения:
All- отключить все;Boxing- приведение к примитивам;Cast- type-cast;Deprecation- игнорирование@Deprecated;NullRawtypes- не параметризованные типы;Serial- отсутствиеserialVersionUIDдляSerializable;Static-method- метод со статичным доступом;Super- переписывание операции;Unchecked- непроверенные операции;Unused- “мертвый” код - неиспользуемый.
1 |
|
@SafeVarargs
Аннотация убирает предупреждения по возможному некорректному использованию varargs атрибута и сигнализирует компилятору, что для внешних методов varargs безопасны, а их обработку без ошибок берет на себя сам метод.
Так происходит когда компилятор указывает внешним методам на небезопасный type-cast. Аннотация применима только к методам, которые могут быть переписаны и у которых есть varargs:
1 |
|