Comments 32
Атрибуты в C# немного удобнее и проще, как по мне… За статью спасибо!
А было бы интересно провести сравнительный анализ аннотаций и атрибутов.
Спасибо за статью, как раз изучаю Java и не понимал, что это, и зачем они нужны.

P.S. заключите код в тег source, а то сливается с текстом ;)
Спасибо, очень доходчиво обьяснили как работать с аннотациями. Ещё бы пару примеров для чего их стоит использоват в своих проектах, и для чего лучше не недо.
Если кратко, то аннотации — это метаданные на уровне классов. Соответственно их используют, когда хотят вынести часть конфигурации непосредственно в код (как например в Spring и Hibernate), для декларативной валидации бинов (см. например здесь).
В GWT аннотации активно используются в механизме локализации сообщений и привязки контролов к разметке в UiBinder.

Еще один вариант кастомного использования — документирование. Например, у вас в руках есть сущности Hibernate и вы хотите с помощью hbm2doc документировать вашу БД. Вы можете зарегистрировать свою аннотацию @Documentation(""), навесить ее на интересующие поля в entity-классах и написать свой хук для этого экспортера, который будет сканировать классы на наличие аннотации.
как доку прочитал. На мой взгляд такие статью надо писать с примерами посочнее.
Посыпая голову пеплом, прочтя всё, что только возможно, но я так и не понял, ДЛЯ ЧЕГО нужны аннотации в Java.
(Бросил Java за то, что язык стал другим и непонятным)
В рантайме — для более простого маппинга данных/связывания объектов. Ну и аспекты потом прикрутили.
Интроспекция изначально считалось худшим, что возможно в ООП. Это нарушение принципов инкапсуляции ради эффективности. Если эффективность не может быть достигнута средствами ООП, то нужно просто брать и использовать другой язык, а не искажать объективную реальность данного.
Кем считалась? Интроспекция интроспекции рознь. Вот, например, контракт JavaBeans нарушает принципы инкапсуляции?
Например, можно использовать @Nullable и @NotNull для контроля значения полей. В IntelliJ IDEA очень на этот счет удобно — автоматические инспекции проверяют, может ли код отдать null и если аннотации совсем нет или указана @NotNull — будет показано нарушение такой-то инспекции, подсвечен подозрительный кусок.

Знаю об удобных инспекциях времени выполнения @ElementsNotNull для коллекций.
@MinValue и @MaxValue — или что-то близкое, — для контроля числовых значений.

В JUnit аннотации используются для отметки функций-тестов (@Test), правил (@Rule), группировки тестов в пакеты.
В общем, как видим, аннотациям можно придумать очень много интересных применений: метаданных очень удобная штука.
Я когда эти @Nullable разрешил поставить в идее, она для этого подключила свой какой-то пакет. А мне почему-то не сильно нравится, когда IDE подключают свои либы. Переносимость на другие IDE становится тогда не шибко приятной. В команде работают как на NetBeans, Eclipse так и на Idea. Стараюсь бить по рукам, когда вижу зависимость от каких либо либ этих IDE. С развитием Мавена эта проблема конечно не так остра, но лично мне режет глаза, когда такие зависимости вижу.
этот самый пакет, а именно annotations.jar, успешно присутствует в мавен репозитории и его можно просто подлючить и не насиловать свои глаза.
есть jsr 305 jcp.org/en/jsr/detail?id=305
там описаны все эти @Nullable. По стандарту они лежат в javax.annotation, распознаются идеей, и наверное эклипсом тоже. Вполне универсальное средство на все IDE.
В настройках Eclipse можно прописать полные имена аннотаций для null и not-null, взятых из любой библиотеки. Так что хоть по JSR.
много для чего они нужны,
например сравните работы со стеком JEE технологий до того, как были введены в язык аннотации и после.
Что быстрее будет сделать, и чревато меньшим количество ошибок разработчика (даже из-за невнимательности),
делать xml файлы для конфигурирования бинов, или же просто заанотировать класс и нужные его поля?

Так же для примера можете вспомнить как работал JUnit до введения аннотаций (до 4 версии),
необходимо было поддерживать определенные названия тестовых методов, наследоваться от TestCase,
вроде ничего сложного, но сейчас тест намного быстрее написать, и осовение этой библиотеки, для тех кто учится,
я думаю стало проще.

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

Раньше метаданные описывались отдельно от кода жуткими простынями xml. Было неудобно, но правильно. Затем изобрели XDoclet, который позволял прописывать метаданные прямо в коде при помощи специальных комментариев, а затем генерировал XML. Затем посчитали это полезным и решили ввести эту фишку прямо в язык ввиде аннотаций. Это удобно, но неправильно с точки зрения теории — код становится «завязан» на контейнер/фреймворк.

Я думаю, лучшим способом будет отказаться от конфигурации контейнера аннотациями и делать это на Java при помощи DSL. Например так делает Guice. В Scala есть интересная ORM Squeryl, которая использует схожий подход. Подобная ORM на Java называется QueryDSL.

P.S. Любителям аннотаций задача: есть модель данных и соответвующие ей джава бины. Нужно: с одной стороны замепить эту модель в базу данных, с другой — сделать вебсервис, работающий с ней. Все при условии, что код модели не дублировать. О том как подружить JPA и JAXB читайте на лучших девелоперских форумах… ))
Кроме уже опомянутого JUnit интересно аннотации используются в библиотеке Google Guice. Вот здесь неплохая статья про то, как инъекция зависимостей реализуется без, а потом уже с использованием аннотаций.
мне показалось что так лучше будет читаться, чисто на глаз для восприятия,
так что не вижу ничего страшного в таком коде, с учетом того, что это просто пример
Вообще это считается моветоном: неоптимальный и бессмысленный код только загромождает место. Да и по смыслу получается масло маслянное.
В статье слабо освещены варианты использования аннотаций.
IMHO, имеет смысл добавить несколько примеров (вкратце), как они используются в современных framework'ах.
Only those users with full accounts are able to leave comments. Log in, please.