Зачем нужны аннотации в Java?
Что проверяют
Понимаете ли вы, что аннотация сама по себе ничего не делает, и знаете ли два способа их обработки.
Как отвечать
Аннотация это метаданные, привязанные к элементу кода: классу, методу, полю, параметру. Сама по себе она не делает ничего: это просто пометка. Всю работу выполняет тот, кто её читает.
Зачем они нужны:
- проверки компилятором: пометка переопределения заставляет компилятор убедиться, что метод действительно что-то переопределяет. Опечатка в имени превращается из молчаливой ошибки в ошибку сборки;
- конфигурация рядом с кодом вместо отдельных описаний. Именно аннотации вытеснили конфигурацию в отдельных файлах: настройка видна там, где применяется;
- генерация кода;
- документирование намерений: пометки об устаревании, о возможности пустого значения, о потокобезопасности.
Важная характеристика это время удержания. Аннотация может существовать только в исходниках, попадать в файл класса или быть доступной во время выполнения. От этого зависит, кто может её прочитать.
Отсюда два способа обработки, и разница между ними существенна:
- обработчики аннотаций на этапе компиляции читают пометки и генерируют код. Так работают библиотеки, убирающие шаблонный код, генераторы преобразователей и контейнеры зависимостей с проверкой графа при сборке. Плюсы: ошибки видны при компиляции, во время выполнения накладных расходов нет вовсе;
- чтение через отражение во время выполнения. Так работает Spring. Гибче, позволяет решать всё в момент старта, но замедляет запуск и переносит часть ошибок из компиляции в рантайм.
Полезно упомянуть, что собственную аннотацию написать несложно, и это оправдано для сквозных вещей: пометить методы, которые надо замерять или кэшировать, а обработку повесить аспектом.
Где спотыкаются
Думают, что аннотация сама меняет поведение.
Не знают про время удержания и удивляются, что пометка недоступна во время выполнения.
Не различают генерацию кода и чтение через отражение.
Считают отражение бесплатным.