JavaRush /Курсы /Модуль 2. Java Core /Аннотации в Java

Аннотации в Java

Модуль 2. Java Core
18 уровень , 1 лекция
Открыта

В 2005 году с приходом версии Java 5 нам стали известны новые сущности под названием аннотации.

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

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

Синтаксис:


@Override
public int hashCode() {
      return super.hashCode();
}

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

Для понимания работы аннотаций сначала познакомимся с понятием маркерного интерфейса. Необходимость помечать определенным образом класс для выполнения над ним тех или иных действий существовала у Java-разработчиков с момента появления языка.

До Java 5 для этого использовали интерфейс, не похожий даже сам на себя и не соответствующий своему предназначению. Он был без методов, не нес за собой никакого контракта, просто помечал класс для обособления.

Такой интерфейс назывался маркерным. Из названия следует, что его задача — это маркировать классы для JVM, компилятора или какой-либо библиотеки. До сих пор остались некоторые маркерные интерфейсы, например, Serializable. Этот маркер позволяет нам пометить класс, сообщая о том, что его экземпляры можно сериализовать.

Мы убедились, что использование маркерных интерфейсов продолжает жить даже после появления аннотаций.

Эквивалентное использование аннотации и маркерного интерфейса:


@MyAnnotation
public class MyClass {}

public class MyClass implements MarkerInterface {}

Несмотря на то, что задача у обоих подходов одна и та же, есть явная разница в их реализации. Для примера рассмотрим интерфейс и аннотацию для определения принадлежности класса к определенному виду.

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

С аннотациями не все так просто: ошибка выявится уже в рантайме, а это значит, что программа начнет выполнение, но, ожидаемо, не закончит.

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


public class MyInteger implements Sum {}
interface Sum {};

public static void main(String[] args) throws IOException {
        increase(new MyInteger());
}
 
public static void increase(Sum count) {
        // TODO
}

Лучше всего здесь подойдет маркерный интерфейс.

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

Давай рассмотрим стандартные аннотации в JDK:

Аннотация Описание Пример
@Override Указывает, что метод переопределяет метод суперкласса или реализует метод абстрактного класса или интерфейса.

@Override
public int hashCode() {
        return super.hashCode();
}
@Deprecated Помечает код как устаревший.

@Deprecated
public abstract void method();
@SuppressWarnings Отключает для аннотированного элемента предупреждения компилятора. Обрати внимание: если необходимо отключить несколько категорий предупреждений, их следует добавить в фигурные скобки, например, @SuppressWarnings ({"unchecked", "cast"}).

public class DocumentsFolder {
   private List documents;

   @SuppressWarnings("unchecked")
public void addDocument(String document) {
            documents.add(document);
   }
}

В этом примере мы пытаемся в методе добавить в список, у которого не определен тип (дженерик). Компилятор предупредит нас об этом. Хоть это и очень полезно, иногда “ворнингов” бывает слишком много, и они очень шумные. В этом случае можно использовать данную аннотацию к методу с указанием параметра-маркера предупреждения компилятора. Маркеров существует очень много,так что необязательно помнить все, обычно IDEA сама подскажет, какой поставить.

Еще пример использования с передаваемыми несколькими параметрами:


@SuppressWarnings({"unchecked", "deprecated"})
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Arthur Kozlov Уровень 51
15 сентября 2025
Местами текст очень замудренный
Семён Уровень 69
4 мая 2025
У меня мозг взрывается от таких предложений: "В этом примере мы пытаемся в методе добавить в список, у которого не определен тип (дженерик)." "В этом примере", "пытаемся В методе", "добавить В список"
Олег Уровень 111 Expert
27 мая 2023
Маркерный интерфейс (marker interface) в Java - это интерфейс, который не содержит методов или полей. Он просто служит как маркер или тег для классов, которые его реализуют. Реализация маркерного интерфейса добавляет определенную семантику или поведение к классу. Маркерные интерфейсы в Java используются для различных целей, таких как: Идентификация класса: Маркерные интерфейсы могут использоваться для обозначения классов, которые обладают определенными свойствами или характеристиками. Например, интерфейс Serializable используется для пометки классов, которые могут быть сериализованы (преобразованы в последовательность байтов) и сохранены или переданы по сети. Управление поведением: Маркерные интерфейсы могут также влиять на поведение классов в системе. Например, в фреймворке JUnit для тестирования Java-кода есть маркерный интерфейс Test, который указывает на то, что класс содержит тестовые методы. Разрешение конфликтов: Маркерные интерфейсы могут использоваться для разрешения конфликтов в множественном наследовании интерфейсов. Если класс реализует несколько интерфейсов, и один из них является маркерным, это может использоваться для указания определенной функциональности или требований. Примеры встроенных маркерных интерфейсов в Java включают Serializable, Cloneable и Remote. Хотя маркерные интерфейсы не содержат методов, они могут быть полезными для проверок типов во время выполнения с использованием оператора instanceof или для анализа и обработки классов с помощью отражения (reflection). Однако следует помнить, что с появлением аннотаций в Java 5 маркерные интерфейсы стали менее распространенными, поскольку аннотации предоставляют более гибкий и удобный способ добавления метаданных к классам и другим элементам кода.
Олег Уровень 111 Expert
27 мая 2023
Если совсем кратко, то аннотации в Java представляют собой механизм добавления метаданных к коду. Они используют символ "@" и позволяют программистам предоставить дополнительную информацию о классах, методах, полях и других элементах кода. Аннотации не влияют на выполнение программы, но могут использоваться различными инструментами для статического анализа, генерации кода или автоматической проверки. В Java существуют как встроенные аннотации, так и пользовательские аннотации. Встроенные аннотации включают: @Override: Помечает метод, который переопределяет метод из суперкласса. @Deprecated: Помечает устаревший метод, класс или поле. @SuppressWarnings: Подавляет предупреждения компилятора. @FunctionalInterface: Помечает интерфейс, предназначенный для использования в качестве функционального интерфейса. Пользовательские аннотации создаются с помощью аннотации @interface и могут содержать параметры и значения по умолчанию. Это позволяет программистам определить свои собственные аннотации для своих нужд. Аннотации в Java могут быть прочитаны с использованием отражения (reflection) и обработаны во время компиляции или выполнения программы. Это дает возможность разработчикам и инструментам выполнять дополнительные действия на основе метаданных, предоставляемых аннотациями.
Ярослав Уровень 48 Expert
1 декабря 2022
Сначала по курсу мы переписываем аннотации, работая с тем же JSON, учимся их изменять. Спустя десяток лекций, нам решили объяснить, а что же такое всё-таки "аннотации". Продуманно на 10 из 10 👍
Андрей Пазюк Уровень 122 Expert
12 июня 2022
Ничего не понял...
Dmytryi Shubchynskyi Уровень 111 Expert
28 сентября 2022
но хоть интересно было?
Андрей Пазюк Уровень 122 Expert
3 октября 2022
Да фигня какая то
Greg Уровень 108 Expert
18 ноября 2022
Согласен. С первого разу ничего не понял.