Яка мета анотацій на Java? У мене є ця нечітка ідея про них як десь між коментарем і фактичним кодом. Чи впливають вони на програму під час виконання?
Які їх типові звички?
Вони унікальні для Java? Чи є еквівалент С ++?
Яка мета анотацій на Java? У мене є ця нечітка ідея про них як десь між коментарем і фактичним кодом. Чи впливають вони на програму під час виконання?
Які їх типові звички?
Вони унікальні для Java? Чи є еквівалент С ++?
Відповіді:
Анотації в основному використовуються кодом, який перевіряє інший код. Вони часто використовуються для зміни (тобто прикрашання або обгортання) існуючих класів під час виконання, щоб змінити свою поведінку. Такі рамки, як JUnit і Hibernate, використовують анотації, щоб мінімізувати кількість коду, який потрібно написати самому, щоб використовувати рамки.
Oracle має хороше пояснення поняття та його значення в Java на своєму сайті.
Також вони унікальні для Java, чи є еквівалент C ++?
Ні, але VB і C # мають атрибути, які є тим самим.
Їх використання досить різноманітне. Один типовий приклад Java @Override
не впливає на код, але компілятор може використовувати його для створення попередження (або помилки), якщо оформлений метод насправді не перекриває інший метод. Аналогічно, методи можуть бути позначені застарілими.
Потім є роздуми. Коли ви відображаєте тип класу у своєму коді, ви можете отримати доступ до атрибутів та діяти відповідно до інформації, знайденої там. Я не знаю прикладів в Java, але в .NET цей компілятор використовується для генерації (де) серіалізації інформації для класів, визначення плану пам'яті структур та оголошення функції імпорту із застарілих бібліотек (серед інших). Вони також контролюють, як працює дизайнер форми IDE.
/ EDIT: Атрибути класів порівнянні з інтерфейсами тегів (наприклад, Serializable в Java). Однак, інструкції з кодування .NET говорять про те, що не використовувати інтерфейси тегів. Крім того, вони працюють лише на рівні класу, а не на рівні методу.
Андерс дає хороший підсумок, і ось приклад примітки JUnit
@Test(expected=IOException.class)
public void flatfileMissing() throws IOException {
readFlatFile("testfiles"+separator+"flatfile_doesnotexist.dat");
}
Тут @Test
анотація говорить JUnit, що flatfileMissing
метод - це тест, який слід виконати, і очікуваний результат є кинутим IOException
. Таким чином, коли ви запускаєте тести, цей метод буде викликаний, і тест буде пройдений або невдалий, виходячи з того IOException
, кинуто ан .
Щоб побачити якісь цікаві речі, які ви можете зробити з Анотаціями, ознайомтеся з моїми примітками JavaBean та процесором анотацій .
Вони чудово підходять для створення коду, додавання додаткових перевірок під час збирання, і я також використовую їх для рамки повідомлень про помилки (ще не опубліковані - потрібно очистити з начальниками ...).
За буквальним визначенням анотація додає примітки до елемента. Аналогічно, анотації на Java - це теги, які ми вставляємо у вихідний код для надання додаткової інформації про код. Анотації Java пов'язують інформацію з елементом програми, що коментується. Окрім приміток Java, програми Java містять велику кількість неформальної документації, яка зазвичай міститься у коментарях до файлу вихідного коду. Але коментарі на Java відрізняються від коментарів, вони анотують елементи програми безпосередньо, використовуючи типи анотацій для опису форми приміток. Анотації на Java представляють інформацію стандартним та структурованим способом, щоб вона могла бути використана пристосовано засобами обробки.
Щоб детально прочитати, є хороший підручник з анотацій Java
Коли ви використовуєте примітку Java @Override та чому? Посилання стосується питання про те, коли слід використовувати замітку заміни (@override). Це може допомогти краще зрозуміти поняття анотації.
Анотації, коли мова йде про EJB, відомий як вибір непрямого підходу в середньому посуді над явним підходом середнього посуду, коли ви використовуєте примітку, ви налаштовуєте, що саме вам потрібно з API, наприклад, вам потрібно зателефонувати за методом транзакцій для банківського переказу : без використання анотації: код буде
transfer(Account account1, Account account2, long amount)
{
// 1: Call middleware API to perform a security check
// 2: Call middleware API to start a transaction
// 3: Call middleware API to load rows from the database
// 4: Subtract the balance from one account, add to the other
// 5: Call middleware API to store rows in the database
// 6: Call middleware API to end the transaction
}
під час використання Анотації ваш код не містить громіздких викликів API для використання проміжних служб. Код чистий і орієнтований на ділову логіку
transfer(Account account1, Account account2, long amount)
{
// 1: Subtract the balance from one account, add to the other
}