GrabDuck

Java 8 аннотации — urvanov.ru

:

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 вложенные классы и лямбда-выражения».
Предыдущая статья — «Классы и объекты в Java 8».

Содержание

Введение

Объявление аннотаций

Предопределённые аннотации

Предопределённые аннотации из пакета java.lang

Мета-аннотации

Введение

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

Аннотации предваряются знаком собачки. Пример часто используемой аннотации @Override, которая указывает компилятору, что этот метод переопределяет базовый метод:

Аннотации могут иметь элементы:

Если элементов много, то они разделяются запятой, если элемент только один, и его имя value , то его название можно не указывать:

 

Объявление аннотаций

Предположим, что вы по традиции при объявлении каждого нового класса монстра записываете в комментариях информацию об авторах в таком виде:

Вы можете записывать эту информацию с помощью аннотаций. Для этого вам сперва нужно объявить эту аннотацию:

Теперь можно применить его к нашему классу Goblin :

Обратите внимание на запись элементов аннотации ( author , sprites , sound ) и на запись массива элементов с использованием фигурных скобок ( comments ).

Можно использовать предопределённую аннотацию @Documented, чтобы наша аннотация попадала в документацию, сгенерированную утилитой JavaDoc:

Предопределённые аннотации

Предопределённые аннотации из пакета java.lang

@Deprecated  указывает, что элемент устарел и не должен использоваться. Компилятор Java генерирует предупреждение, если вы используете класс, метод или поле, помеченные аннотацией @Deprecated. Устаревший элемент должен быть также помечен тегом JavaDoc @deprecated :

@Override  указывает, что метод переопределяет метод базового класса. Эту аннотацию использовать не обязательно, но рекомендуется.

Если метод с @Override  не может корректно переопределить метод базового класса, то компилятор генерирует ошибку.

@SuppressWarnings подавляет предупреждения. Пример подавления предупреждения об устаревшем методе:

Каждое предупреждение принадлежит какой-либо категории. В спецификации Java описано две категории. В @SupressWarnings  можно указывать несколько категорий:

Различные реализации компиляторов и различные IDE могут добавлять свои категории предупреждений. Неподдерживаемые названия категорий пропускаются при использовании @SuppressWarnings.

@SafeVarargs применяется к методу или конструктору и указывает, что код не осуществляет потенциально опасных операций со своим varargs-параметром (параметр, принимающий произвольное число параметров).

@FunctionalInterface указывает, что это объявление типа будет функциональным интерфейсом Java 8.

Мета-аннотации

Аннотации, применяемые к другим аннотациям, называются мета-аннотациями. Есть несколько мета-аннотаций в пакете java.lang.annotation :

@Retention определяет, как аннотация будет сохранена:

  • RetentionPolicy.SOURCE — аннотация будет только в исходном коде, и она будет игнорироваться компилятором.
  • RetentionPolicy.CLASS — аннотация будет доступна компилятору, но но будет игнорироваться виртуальной машиной Java.
  • RetentionPolicy.RUNTIME — аннотация будет сохраняться JVM и будет доступна во время выполнения.

@Documented — указывает, что элементы, помеченные этой аннотацией, должны документироваться JavaDoc. По умолчанию аннотации не включаются в документацию.

@Target — указывает какие элементы можно помечать этой аннотацией:

  • ElementType.ANNOTATION_TYPE — данная аннотация может быть применена к другой аннотации.
  • ElementType.CONSTRUCTOR — может быть применена к конструктору.
  • ElementType.FIELD — может быть применена к полю.
  • ElementType.LOCAL_VARIABLE — может быть применена к локальной переменной.
  • ElementType.METHOD — может быть применена к методу.
  • ElementType.PACKAGE — может быть применена к пакету.
  • ElementType.PARAMETER — может быть применена к параметрам метода.
  • ElementType.TYPE — может быть применена к любому элементу класса.

@Inherited — аннотация может быть унаследована от базового класса (по умолчанию не наследуются). Когда запрашивается аннотация класса, и у класса нет такой аннотации, то запрашивается аннотация базового класса. Эта аннотация может быть применена только к классам.

@Repeatable — аннотация может быть применена несколько раз.

Допустим мы хотим применить аннотацию @Author  несколько раз для указания нескольких авторов:

Тогда мы должны объявить такую аннотацию вот так:

Обратите внимание, что добавлена аннотация @Repeatable  с указанием Authors.class , который мы должны объявить как аннотацию с массивом аннотация Author:

Теперь мы можем указывать аннотацию @Author  столько раз, сколько захотим, для любого класса.

Цикл статей «Учебник Java 8».

Следующая статья — «Java 8 вложенные классы и лямбда-выражения».
Предыдущая статья — «Классы и объекты в Java 8».


Поделиться: