Знижка 20% на курс GRASP & GOF Design Patterns
Дізнатися більше
06.01.2025
7 хвилин читання

Як використовувати анотації у Java: поради та приклади

Анотації в Java — це спеціальні метадані, які можуть додаватися до класів, методів, полів і навіть до інших анотацій. Вони дозволяють розробникам додавати додаткову інформацію до коду, впливати на поведінку методів чи класів, запускати специфічний код під час виконання програми або автоматизувати виконання певних дій. Анотації з’явилися в Java з версії 5 і стали невід’ємною частиною багатьох фреймворків і бібліотек, спрощуючи налаштування та автоматизацію багатьох завдань.

У цій статті ми розглянемо, як правильно використовувати анотації в Java, ознайомимося з основними вбудованими анотаціями, дізнаємось, як створювати власні анотації, а також вивчимо їх роль у популярних бібліотеках та фреймворках.

Якщо ви хочете поглибити свої знання в Java і дізнатися більше про такі теми, як анотації, рекомендуємо курси від компанії FoxmindEd. Вони пропонують сучасні і детальні навчальні програми, які допоможуть вам стати експертом в цій області.

Бажаєте освоїти професію Java Developer? Приєднуйтесь до програми “Від 0 до Strong Java Junior за 12 місяців”. Скористайтесь вигідною пропозицією від FoxmindEd!
Зареєструватись

Що таке анотації

Анотації в Java — це інструмент, що дозволяє додавати спеціальні інструкції або “лейбли” до класів, методів, полів або параметрів без зміни їхньої поведінки безпосередньо в коді. Вони можуть використовуватися як для інформування компілятора, так і для виконання певних дій під час компіляції чи виконання програми.

Наприклад, анотація @Deprecated використовується для маркування класу або методу як застарілого. Це сигналізує розробникам, що цей елемент не рекомендується до використання, і в майбутньому його може бути видалено. Безпосередньо ця анотація нічого не робить, а лише несе інформативний характер.

Анотації також дозволяють виконувати певний код під час виконання програми. Наприклад, анотація @Test у JUnit використовується для маркування методів як тестів. Коли тестовий фреймворк запускається, він автоматично виконує всі методи, помічені цією анотацією, без необхідності вручну викликати кожен тестовий метод.

Ще один цікавий приклад — анотація @Data з бібліотеки Lombok. Вона автоматично генерує методи getters, setters, toString, equals, hashCode та конструктор на основі полів класу. Це значно спрощує код, особливо в класах-моделях, де є багато полів, інакше довелося б вручну писати всі ці методи.

Анотації також є важливою частиною багатьох сучасних Java-фреймворків, що дозволяють автоматизувати конфігурацію та спростити розробку. Вони широко використовуються у фреймворках Spring, JUnit та Hibernate.

Анотації типу @Controller, @Service або @Repository у Spring допомагають розподілити відповідальність між різними компонентами програми і дозволяють Spring автоматично керувати цими компонентами. Наприклад, @Controller означає, що клас відповідає за обробку HTTP-запитів у веб-додатку. Це полегшує управління залежностями, дозволяючи Spring автоматично створювати і керувати екземплярами класів.

Також є анотації, які впливають на поведінку програм під час виконання, як-от @Transactional у Spring, яка автоматично обгортає метод у транзакцію, забезпечуючи безпеку роботи з базою даних.

Таким чином, анотації в Java дозволяють значно спростити код, автоматизувати певні задачі і зменшити кількість шаблонного коду. Вони можуть бути як інформативними для розробника чи компілятора, так і впливати на реальну поведінку програми під час її виконання.

Анотації зазвичай записуються перед оголошенням класу, методу, поля або параметра та позначаються знаком “@” перед їх назвою. Ви певно зустрічали таку анотація як @Override, яка вказує компілятору, що метод перевизначає метод із суперкласу. У Java є кілька вбудованих анотацій, які широко використовуються для різних цілей: від позначення застарілих елементів до полегшення тестування та налаштування. 

Де використовуються анотації

  • На класах: Анотації можуть використовуватися для позначення класів. 
@Component

public class MyComponent {

   // клас із роллю компонента

}
  • На методах: Анотації широко застосовуються для методів, наприклад, щоб вказати, що метод тестується за допомогою JUnit:
@Test

public void myTest() {

   // тестовий метод

}
  • На полях: Анотації можуть використовуватися для налаштування полів. Наприклад, у Hibernate анотація @Column використовується для відображення поля в колонку бази даних:
@Column(name = "username")

private String username;
  • На параметрах: Анотації можуть також використовуватися для параметрів методів. Наприклад, у Spring можна використовувати анотацію @RequestParam для отримання параметра HTTP-запиту:
public void handleRequest(@RequestParam("id") int id) {

   // метод обробки запиту з параметром

}

У наступному розділі ми детальніше розглянемо, як використовувати анотації у різних сценаріях, а також навчимося створювати власні анотації для вирішення специфічних завдань.

Створення власних анонтацій

У Java можна створювати власні анотації, щоб додавати спеціальні правила або функції, які будуть виконуватись під час роботи програми. Наприклад, ми можемо створити анотацію для валідації телефонного номера, щоб переконатися, що дане поле відповідає певному формату. Таким чином ми зможемо не дублювати код для валідації номеру у сервісах.

Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись
  • Крок 1: Створення анотації

Спочатку потрібно створити власну анотацію для перевірки правильності телефонного номера. Ця анотація буде використовуватися для маркування полів, які потрібно перевіряти.

@Constraint(validatedBy = PhoneValidatorImpl.class)

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

public @interface PhoneValidator {

   String message() default "Invalid phone number";

   Class<?>[] groups() default {};

   Class<? extends Payload>[] payload() default {};

}

Тут ми використовуємо дві мета-анотації:

@Target(ElementType.FIELD) означає, що анотацію можна застосовувати тільки до полів.

@Retention(RetentionPolicy.RUNTIME) вказує, що анотація зберігається в байт-коді і доступна під час виконання.

Пару слів, нащо нам Target та Retention та які можливості застосування анотації є.

RetentionPolicy показує, на якому етапі життєвого циклу програми, анотації можуть бути доступнима. Є наступні політики доступності анотації:

  • SOURCE: Анотації доступні тільки під час компіляції та не зберігаються в байт-коді. Вони видаляються після компіляції. Тож вона не буде доступна в байт-коді або під час виконання програми. Наприклад, бібліотека Lombok використовує анотації типу @Getter, @Setter, які теж не залишають сліду в байт-коді, оскільки їхня мета — генерувати код на етапі компіляції. Далі вони нам не потрібні, адже необхідний код вже згенерований.

У Java анотація @Target визначає, до яких елементів коду може бути застосована ваша анотація. Вона приймає параметри з переліку ElementType, які вказують на різні елементи коду, де можна використовувати анотацію.

Ось список основних значень ElementType:

  • ElementType.FIELD – поля класу
  • ElementType.METHOD – методи класу
  • ElementType.PARAMETER – параметри метода або конструктора
  • ElementType.CONSTRUCTOR – конструктор класу
  • ElementType.LOCAL_VARIABLE – локальних змінних у методах
  • ElementType.ANNOTATION_TYPE – можна застосовувати до інших анотацій (анотації на анотації)
  • ElementType.PACKAGE – можна застосовувати до декларацій пакетів
  • ElementType.TYPE – можна застосовувати до типів, таких як класи, інтерфейси, переліки (enum) або анотації
  • ElementType.TYPE_PARAMETER – анотація може бути застосована до параметрів типу у загальних класах, інтерфейсах або методах. Параметри типів — це ті літери (наприклад, T, E, K, V тощо), які ми використовуємо в узагальнених (generic) класах і методах, що дозволяють визначати типи даних, з якими цей клас або метод буде працювати
@Target(ElementType.TYPE_PARAMETER)

@interface MyTypeParameterAnnotation {

}

class MyGenericClass<@MyTypeParameterAnnotation T> {

   // Тут анотація застосовується до параметра типу T

}
  • ElementType.TYPE_USE – на відміну від інших елементів, таких як FIELD чи METHOD, які застосовуються тільки до певних частин коду, TYPE_USE дозволяє застосовувати анотацію до будь-якого використання типу в Java-коді.
  • Крок 2: Створення валідатора

Далі нам потрібно створити логіку для валідації полів, на яких встановлена наша анотація @PhoneValidation. 

import java.util.regex.Pattern;

import javax.validation.ConstraintValidator;

import javax.validation.ConstraintValidatorContext;

import javax.validation.ValidationException;

public class PhoneValidatorImpl implements ConstraintValidator<PhoneValidator, String> {

   private static final String PHONE_REGEX = "^\\+\\d{1,3}-\\d{9}$";

   private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX);

   private static final String INVALID_PHONE_EXCEPTION = "Not valid phone number. " +

           "Phone number must be in the next format +XXX-XXXXXXXXXX";

   @Override

   public boolean isValid(String phone, ConstraintValidatorContext context) {

       if (!PHONE_PATTERN.matcher(phone).matches()) {

           throw new ValidationException(INVALID_PHONE_EXCEPTION);

       }

       return true;

   }

}

Тепер ми можемо використати анотацію над полем нашого класу. Так як наша анотації має RetentionPolicy.RUNTIME, ми можемо використовувати її під час виконання програми. Тож логіка, що прописана у класі PhoneValidatorImpl, буде доступна у runtime і нам не треба буде її дублювати у сервісах.

public class UserDto {

   @PhoneValidator

   private String phone;

}

Висновок

Анотації в Java є потужним інструментом, який значно спрощує розробку, налаштування та підтримку додатків. У таких фреймворках, як Spring, Hibernate та JUnit, вони дозволяють автоматизувати рутинні процеси, як-от ін’єкція залежностей, робота з базами даних та тестування. Завдяки анотаціям розробники можуть зосередитися на бізнес-логіці, мінімізуючи кількість конфігураційного коду та підвищуючи модульність і читабельність програм. Важливо знати і правильно використовувати анотації, оскільки це робить код ефективнішим, чистішим і зручнішим для підтримки в довгостроковій перспективі. Крім того, поєднання анотацій з аспектно-орієнтованим програмуванням (АОП) дозволяє автоматизувати перехресні задачі, що значно зменшує повторюваність коду та спрощує його підтримку.

Якщо ви хочете поглибити свої знання в Java і навчитися правильно використовувати анотації, компанія FoxmindEd пропонує відмінний курс Java.

FAQ
Що таке анотації в Java?

Анотації — це метадані, які додаються до коду для маркування класів, методів, полів чи параметрів. Вони не змінюють поведінку напряму, але часто впливають через фреймворки або компілятор.

Як створити власну анотацію?

Використовуйте мета-анотації, як-от @Target для вказання області застосування та @Retention для визначення, коли анотація доступна (під час компіляції чи виконання).

Які є рівні збереження анотацій?

SOURCE: Доступні лише під час компіляції. CLASS: Зберігаються у байт-коді, але недоступні в runtime. RUNTIME: Доступні під час виконання програми через рефлексію.

Для чого використовують анотації в Spring?

Анотації, як-от @Controller, @Service або @Transactional, дозволяють автоматизувати керування компонентами, обробку HTTP-запитів і налаштування транзакцій.

Чим корисна анотація @Data з Lombok?

Вона генерує методи getters, setters, toString, equals і hashCode, зменшуючи кількість шаблонного коду у класах-моделях.

Яка різниця між @Override та @Test?

@Override: Інформує компілятор, що метод перевизначає метод суперкласу. @Test: Використовується в JUnit для маркування тестових методів, які автоматично викликаються тестовим фреймворком.

🤔 Залишилися запитання про використання анотації у Java? - Сміливо задавайте нижче! 💬

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів