Аннотации. Часть первая, немного скучная
В этой части я решил затронуть библиотеку Lombok как известного представителя Source аннотаций. С Runtime аннотациями в следующей статье.
Жил был java программист, каждый день он писал обычный код, например такой:
Надеюсь тут тебе, читатель, стало интересно, потому что дальше будет коротка вводная и ссылки на подробности.
Ломбок так же предоставляет возможность кастомизировать генерацию, не всегда же нужны все геттеры, сеттеры или хешкод надо генерировать по-другому. Поэтому есть отдельные аннотации (думаю, многие из них в описании не нуждаются)
@Getter/@Setter
@ToString
@EqualsAndHashCode
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
@Log
Это самые типичные, весь набор можно посмотреть тут
Особого внимания достойный var и val. Это возможность писать так:
package lombok;
public class Chelovek {
private String name;
private int age;
public Chelovek(String name, int age) {
this.name = name;
this.age = age;
}
public Chelovek() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Chelovek chelovek = (Chelovek) o;
if (age != chelovek.age) return false;
return name != null ? name.equals(chelovek.name) : chelovek.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
@Override
public String toString() {
return "Chelovek{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Обычный такой класс, всего 2 поля (а ведь бывает и больше 10-15 полей). Да конечно это все можно генерировать в IDE, но блин, оно место занимает. Если полей 15-20, ко всем нужны геттеры, сеттеры, конструкторы… Среди всего этого легко может потеряться пара другая методов, незаметных глазу.
Как помочь такому программисту, чтобы писал быстрее и меньше? Lombok.
Сразу в пекло, тот же класс но с использование ломбока:
package lombok;
@Data
public class Chelovek {
private String name;
private int age;
}
Да это все. Прикольно?
Что сделает аннотация @Data?
Она на этапе компиляции сгенерирует геттеры\сеттеры для всех полей, toString и переопределит equals и hashCode по стандартам. В IDE можно установить плагин и он будет видеть все ещё не созданные методы.
package lombok;
import lombok.experimental.var;
@Data
public class Chelovek {
private String name;
private int age;
public static void main(String[] args) {
var chelovek = new Chelovek();
chelovek.setAge(22);
System.out.println(chelovek);
}
}
Зачем это нужно? Например у нас есть класс RandomAccessFileChannel
Ну, зачем нам писать так:
RandomAccessFileChannel channel = new RandomAccessFileChannel();
Если можно так:
var channel2 = new RandomAccessFileChannel();
На мой взгляд, это не всегда приемлемо. Например, у нас есть злой метод, возвращающий злую мапу:
public static Map<List<Set<Integer>>, Set<List<String>>> evilMap(){
return new HashMap<>();
}
если вызывать его так:
Map<List<Set<Integer>>, Set<List<String>>> listSetMap = evilMap();
То более менее понятно с чем мы работаем.
Если же вызов такой:
var listSetMap = evilMap();
то хрен знает, что там возвращает evilMap(), и пока не посмотришь в сам метод, не узнаешь. А зачем бегать по исходникам? В общем, с этим надо быть аккуратнее.
Экспериментальная ветка:
Тут хочу отметить аннотации:
@UtilityClass
Она создает приватный конструктор и там бросает exception (чтоб ручки грязные от рефлексии не лезли сюда). И очень красиво в начале класса сообщает нам, что тут утилитные методы.
@Delegate
Реализует шаблон делегирования. Если у тебя есть класс, который что-то делегирует другому классу, при этом вносит изменения только в некоторые методы, эта аннотация избавит тебя от дублирования методов + будет следить за ними. Если метод удалили или добавили, она это заметит.
Ветка экспериментальных аннотаций
GITHUB
Официальный сайт
Для того, чтобы IDE нормально работала с lombok, и не подчеркивала методы как несуществующие, надо установить плагин.
На официальном сайте, есть раздел setup в котором можно посмотреть как подключить плагин для каждой IDE
Как можно заметить ломбок популярен. >5000 звезд и >1000 форков. Спринг в своих классах использует ломбок. Если у тебя в проекте есть спринг, поищи, возможно, он подтянул ломбок, просто ты не в курсе.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ