Java сильно критикуют и ненавидят за многословие. Даже для таких вещей, как чтение/запись файлов, мы должны церемонно писать много общих вещей. Набирающая популярность библиотека Java Lombok успешно решает эту проблему. Это Java-библиотека на основе аннотаций, которая подключается к редакторам, IDE и инструментам сборки во время компиляции, облегчая создание стандартного кода и делая код чистым и более читабельным. В этой библиотеке много функций и аннотаций, но чтобы проиллюстрировать, насколько полезной она оказалась для меня в повседневной работе, я расскажу о @Data
аннотации.
Допустим, у нас есть POJO (обычный старый объект Java) для представления каких-то данных в нашей программе. Используя ванильную Java, мы получаем следующее:
public class Person { private String id,name,nationality; public Person(String id, String name, String nationality) { this.id = id; this.name = name; this.nationality = nationality; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNationality() { return nationality; } public void setNationality(String nationality) { this.nationality = nationality; } //override equals, hashCode,toString }
В этом коде нет ничего плохого. Многие из этих шаблонных кодов также могут быть сгенерированы с помощью внутренних инструментов IDE. Но прохождение этого кода не является приятным занятием. Это просто класс Data или в него встроены какие-то специальные методы? Теперь давайте напишем то же самое, используя @Data.
import lombok.Data; @Data public class Person { private String id,name,nationality; }
Да, это так. @Data
аннотация создает для нас геттеры, сеттеры, конструкторы, переопределяет equals, hashCode и toString. Код теперь очень чистый и читабельный, не запутанный. Чтобы это работало, нам нужно импортировать библиотеку Lombok (jar, Gradle и Maven) и на основе IDE включить обработку аннотаций. Например, в IntelliJ:
После аннотирования класса Java мы можем проверить, что было вставлено, используя javap
дизассемблер или инструмент IDE под названием Delombok
.
Для нашего приведенного выше примера:
//generated using delombok tool of Intellij IDEA public class Person { private String id,name,nationality; public Person() { } public String getId() { return this.id; } public String getName() { return this.name; } public String getNationality() { return this.nationality; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public void setNationality(String nationality) { this.nationality = nationality; } public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof Person)) return false; final Person other = (Person) o; if (!other.canEqual((Object) this)) return false; final Object this$id = this.getId(); final Object other$id = other.getId(); if (this$id == null ? other$id != null : !this$id.equals(other$id)) return false; final Object this$name = this.getName(); final Object other$name = other.getName(); if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; final Object this$nationality = this.getNationality(); final Object other$nationality = other.getNationality(); if (this$nationality == null ? other$nationality != null : !this$nationality.equals(other$nationality)) return false; return true; } public int hashCode() { final int PRIME = 59; int result = 1; final Object $id = this.getId(); result = result * PRIME + ($id == null ? 43 : $id.hashCode()); final Object $name = this.getName(); result = result * PRIME + ($name == null ? 43 : $name.hashCode()); final Object $nationality = this.getNationality(); result = result * PRIME + ($nationality == null ? 43 : $nationality.hashCode()); return result; } protected boolean canEqual(Object other) { return other instanceof Person; } public String toString() { return "Person(id=" + this.getId() + ", name=" + this.getName() + ", nationality=" + this.getNationality() + ")"; } }
Это всего лишь один пример того, как мы можем использовать Lombok, чтобы оживить наше java-кодирование. Существует множество других аннотаций для таких целей, как обработка исключений, очистка ресурсов и так далее.