JavaRush /Курсы /Java Collections /Аннотации. Как пользоваться

Аннотации. Как пользоваться

Java Collections
8 уровень , 7 лекция
Открыта

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

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

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

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

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

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

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

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

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

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

Аннотации можно использовать для генерации 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()
{ 

}

— Понятно.

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

— Конечно.

Комментарии (26)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
overbf bf Уровень 42
10 ноября 2023
Вернулся сюда, что бы оставить это: https://javarush.com/groups/posts/1896-java-annotacii-chto-ehto-i-kak-ehtim-poljhzovatjhsja а то дальше вообще ничего не понятно...
Ra Уровень 51 Student
28 июля 2023
Когда пишете аннотацию, нажимайте Ctrl+P. И вообще всегда, когда нужны параметры метода)
Anonymous #3091828 Уровень 51
1 декабря 2022
Чет комментов становится оч мало, где люди подевались.
runk out Уровень 51
13 декабря 2022
им некогда курс проходить - они комменты пишут
Рогов Игорь Уровень 17
31 мая 2022
не раскрыта цель аннотаций и их прям такая необходимость
Oleg Khilko Уровень 51
14 августа 2022
На это ответит Спринг =)
Valua Sinicyn Уровень 41
26 февраля 2021
Тема маркеров аннотаций не раскрыта. Маркеры @SuppressWarnings: • all - отключение всех предупреждений; • boxing - отключение предупреждений, связанных с приведением к классам и простым типам; • cast - отключение предупреждений, связанных с преобразованием типов; • dep-ann - отключение предупреждений, связанных с устаревшими аннотациями; • deprecation - отключение предупреждений, связанных с устареванием; • fallthrough - отключение предупреждений, связанных с отсутствующими точками прерывания в операторах выбора; • finally - отключение предупреждений, связанных с окончательными блокировками, не возвращающими управление; • hiding - отключение предупреждений, связанных с локальными объектами, скрывающими переменные; • incomplete-switch - отключение предупреждений, связанных с недостающими элементами в операторах выбора (enum case); • javadoc - отключение предупреждений, связанных с предупреждениями javadoc; • nls отключение предупреждений, связанных с литеральными строками, не являющимися nls; • null - отключение предупреждений, связанных с анализом null; • rawtypes - отключение предупреждений, связанных с использованием непараметризованных типов; • resource - отключение предупреждений, связанных с использованием ресурсов типа Closeable; • restriction - отключение предупреждений, связанных с использованием нерекомендованных или запрещенных ресурсов; • serial - отключение предупреждений, связанных с недостающим полем serialVersionUID в классе, допускающем сериализацию; • static-access - отключение предупреждений, связанных с некорректными операциями статического доступа; • static-method - отключение предупреждений, связанных с методами, которые могут быть определены с модификатором static; • super - отключение предупреждений, связанных с переопределением метода без вызова базового метода; • synthetic-access - отключение предупреждений, связанных с неоптимизированным доступом из внутренних классов; • sync-override - отключение предупреждений из
Anton Stezhkin Уровень 41
23 августа 2021
sync-override: отключение предупреждений об отсутствии слова synchronized при переопределении синхронизированных методов
18 ноября 2022
unchecked - не проверяет, является ли тип данных объектом или примитивом.
ram0973 Уровень 41
12 января 2021
Небольшой бесплатный курс по Спрингу. Курс простой, понятный и демонстрирует аннотации, а также REST, SQL, HTTP, JSON. Самое время пройти за несколько вечеров. Интересно, что в IDEA есть и генератор HTTP-запросов, и SQL-консоль.Также официальный туториал , сложнее
Pavlo Buidenkov Уровень 41
30 мая 2020
а на работе прежде чем добавлять свою супер крутую аннотацию, нужно иметь хороший разговор с коллегами и аргументировать им почему она крайне необходима, и только после того как они согласны уже её реализовывать. ни для кого не секрет, что многие аннотации в коде просто раздражают и, иногда, уменьшают читабельность и предсказуемость кода.
Ilia lenskii Уровень 32
22 сентября 2022
"ни для кого не секрет, что многие аннотации в коде просто раздражают" в самое сердце
sunshine4545 Уровень 41
15 мая 2020
Я так и не поняла зачем мне эти аннотации, зачем я буду их сама создавать...🤷🏼‍♀️
25 декабря 2022
скорее всего не будешь, эти аннотации больше нужны когда создаются объекты в рантайме, бины например у Спринга, или энтити в Хибере. так что это больше нужно для создания фреймворков. Но один раз писан аннотацию для валидации полей entity.
Даниил Уровень 41 Master
9 октября 2019
Хорошая ссылка по встроенным в java аннотациям. А это про SafeVarargs.
Лёхансан Уровень 39
17 февраля 2021
Спс)
21 марта 2018
Так будет при @Deprecated int year = date.getYear();
NodeOne Уровень 41 Expert
9 марта 2019
так точно! @Deprecated означает не рекомендуется использовать т.к. устаревший и возможно когда нибудь будет исключен из библиотек.
Алексей Уровень 39
2 июля 2020
Вроде нельзя исключать из библиотек из-за обратной совместимости