— Привет, Амиго!

— Здорово, Риша.

— Сегодня я поближе познакомлю тебя с аннотациями.

Как ты уже, наверное, знаешь – аннотации – это такие специальные слова, которые можно размещать рядом с классами, полями, методами и переменными.

— Ага. Очень часто их встречаю.

— Иногда их называют еще метаданными. Основная их задача – хранить некоторую дополнительную информацию о методах, полях и классах.

— А для кого они ее хранят?

— Это очень хороший вопрос.

Раз эти аннотации пишут, значит, они кому-то нужны.

Аннотации позволяют хранить дополнительную информацию о коде и элементах программы, но формально не являются частью кода.

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

Пример аннотаций в коде:

Пример
@CatInfo(manager=Catmanager.class, unique=true)
class Cat
{
 @Name("Murka")
 private String name;

 @SuppressWarnings(value = "unchecked")
 void getUniqueCatName()
 {

 }
}

Как ты видишь, в аннотациях можно хранить данные.

Если аннотация имеет только одно поле value, то его можно опускать:

Пример
@SuppressWarnings("unchecked")
void getUniqueCatName()
{ 

}

Если параметров в скобках нет, скобки тоже можно не писать:

Пример
@Override
void getUniqueCatName()
{ 

}

Создать свою аннотацию очень легко. Объявление аннотации – практически идентично объявлению интерфейса.

Пример
@interface CatManager
{
 Class manager();
 boolean unique();
 String name() default "Unknown Cat";
}

Есть всего пара отличий.

Во-первых, перед словом interface ставится символ «@».

Во-вторых, аннотация может содержать значения по умолчанию. Для этого используется слово default. См. пример выше. Такие параметры являются необязательными и их можно опускать при добавлении аннотаций.

— Ага. Все оказалось проще, чем я думал. А то я уже шарахался от них, как Рободьявол от святой воды. Неприятно, когда в коде куча всяких штук, которые до конца не понимаешь.

— О, хорошо, что напомнил, хочу еще рассказать об аннотациях, используемых компилятором.

Таких аннотаций всего 3. Пока три.

@Deprecated.

Класс или метод можно пометить аннотацией @Deprecated. Тогда компилятор будет выдавать предупреждение (предупреждение — это не ошибка), а Intellij IDEA будет отображать этот метод как перечеркнутый. Примерно так:

Пример
Date date = new Date();
int year = date.getYear();

@Override.

При переопределении метода, хорошим тоном считается добавить ему аннотацию @Override.

— А для чего? Вроде же IDEA и так показывает, переопределен метод или нет?

— Во-первых, то IDEA, а то синтаксис Java.

А во-вторых, гипотетически может быть ситуация, когда метод базового класса переименуют, а метод наследника – нет. И программа будет работать неправильно, но никто этого не заметит. Для предотвращения таких ситуаций и была придумана эта аннотация:

Пример
@Override
void getUniqueCatName()
{

}

@SuppressWarnings.

— Иногда компилятор выводит очень много предупреждений. Или мы знаем о «проблемах» и сознательно пошли на такое использование. С помощью этой аннотации можно скрыть часть из них.

С помощью аннотации @SuppressWarnings, программист может сказать компилятору: не нужно показывать предупреждения, так задумано, это не ошибка. Пример:

Пример
@SuppressWarnings("unchecked")
void getUniqueCatName()
{ 

}

— Понятно.

— Что-то я немного устал, пойду, промочу горло. Давай продолжим после перерыва, ок?

— Конечно.