предисловие
Недавно, когда я искал в Интернете, я обнаружил, что многие людиlombok
Смешанные отзывы, пробудили мой интерес, так как мы также много используем в наших проектах.lombok
, Несколько дней меня смущали различные взгляды всех, Сегодня я расскажу о своих личных предложениях, основанных на моем реальном опыте работы над проектами.
Просто беглый поиск и нашел эти статьи:
Эти люди рекомендуют использоватьlombok
, я думаю, что это артефакт, который может значительно повысить эффективность кодирования и сделать код более элегантным.
В процессе поиска не рекомендуются некоторые статьи:
Эти люди думают, что в нем есть подводные камни, и в нем легко закопать скрытые опасности для проекта Кого же нам слушать?
Почему рекомендуется ломбок?
1. Традиционные javabeans
не используетсяlombok
Раньше мы обычно определяли javabeans следующим образом:
public class User {
private Long id;
private String name;
private Integer age;
private String address;
public User() {
}
public User(Long id, String name, Integer age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
public String getAddress() {
return address;
}
public void setId(Long id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(name, user.name) &&
Objects.equals(age, user.age) &&
Objects.equals(address, user.address);
}
@Override
public int hashCode() {
return Objects.hash(id, name, age, address);
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
ДолженUser
Класс содержит: переменные-члены, методы получения/установки, конструкторы, методы equals, методы hashCode.
На первый взгляд кода еще много. И есть еще одна проблема, еслиUser
Код в классе был изменен, например, поле age было изменено на строковый тип или поле имени было изменено.Необходимо ли синхронно изменить соответствующие переменные-члены, методы getter/setter, методы конструктора, equals и методы hashCode?
Может быть, некоторые друзья скажут: текущая идея очень умная, и модификацию можно сделать за один раз.
Верно, но есть более элегантные способы сделать это.
2. Использование ломбока
Первый шаг - ввести пакет jar
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
Второй шаг — установка плагина в идею
Примечание. Если вы не будете следовать идее плагина, вы не сможете его скомпилировать и использовать.
lombok
Аннотированный код.
Третий шаг, использование в кодеlombok
аннотация
вышеUser
Код класса можно изменить на это:
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class User {
private Long id;
private String name;
private Integer age;
private String address;
}
так хорошо, код можно оптимизировать, чтобы он был таким простым.User
В теле класса нужно только определить переменные-члены, а все остальные методы оставлены для аннотаций.
Что делать, если имя или тип переменной-члена изменены?
@ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class User {
private Long id;
private String userName;
private String age;
private String address;
}
Вам нужно полностью изменить только переменные-члены, и вам вообще не нужно беспокоиться об остальном, что действительно здорово.
Что еще более интересно, так это то, что его можно дополнительно оптимизировать:
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {
private Long id;
private String userName;
private String age;
private String address;
}
@Data эквивалентен набору @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor.
lombok
Аннотации организованы следующим образом:
Источником изображения стал маленький волк
Вид сверху с использованиемlombok
Самое большое впечатление, что количество кода значительно уменьшено, что может эффективно повысить эффективность разработки, и код выглядит более элегантно, что действительно является редким артефактом.
Как работает ломбок
Анализ Java-программы делится на:运行时解析
и编译时解析
.
Обычно мы получаем классы, методы, аннотации и переменные-члены через отражение运行时解析
. Однако этот метод не очень эффективен и может быть проанализирован только во время работы программы.
В настоящее время синтаксический анализ во время компиляции отражает его значение.
Анализ времени компиляции далее делится на:注解处理器(Annotation Processing Tool)
иJSR 269 插入式注解处理器(Pluggable Annotation Processing API)
Первый процессор, впервые представленный в JDK 1.5 вместе с Annotation, представляет собой инструмент командной строки, который обеспечивает возможность чтения структуры программы на основе исходного кода во время сборки и может запускать процессор аннотаций для создания новых промежуточных файлов. , которые, в свою очередь, влияют на процесс компиляции.
Однако после JDK 1.8 первый процессор был упразднен и заменен вторым процессором.Давайте посмотрим на его процесс обработки:
Основной конкретный процесс реализации Lombok выглядит следующим образом:
- javac анализирует исходный код и создает абстрактное синтаксическое дерево (AST)
- Программа Lombok, которая реализует «JSR 269 API», вызывается во время компиляции.
- На этом этапе Lombok обрабатывает AST, полученный на первом шаге, находит синтаксическое дерево (AST), соответствующее классу, в котором находится аннотация @Data, а затем модифицирует синтаксическое дерево (AST), добавляя соответствующие узлы дерева, определенные геттер и сеттер методы.
- javac использует модифицированное абстрактное синтаксическое дерево (AST) для генерации файлов байт-кода, то есть добавления новых узлов (блоков кода) в класс
Почему не рекомендуется использовать ломбок?
Несмотря на тоlombok
Артефакт, но многие не рекомендуют его использовать, почему так?
1. Заставьте товарищей по команде установить плагин идеи
Это действительно отвратительно, потому что, если вы используете ломбок-аннотации для написания кода, все, кто участвует в разработке, должны установить ломбок-плагин идеи, иначе код будет компилироваться неправильно.
2. Плохая читаемость кода
После использования аннотации lombok вы не можете увидеть окончательный сгенерированный код, вы можете видеть, как выглядел код до того, как он был изменен. Если вы хотите увидеть эталонный процесс метода получения или установки, это очень сложно.
3. Обновление JDK влияет на функциональность
Когда кто-то обновил JDK с Java 8 до Java 11, я обнаружил, что Lombok работает неправильно.
4. Есть ямы
-
При использовании @Data по умолчанию используется @EqualsAndHashCode(callSuper=false).В настоящее время сгенерированный метод equals() будет сравнивать только свойства подкласса и не будет учитывать свойства, унаследованные от родительского класса, независимо от открыты ли права доступа к свойству родительского класса или нет.
-
Добавьте @AllArgsConstructor при использовании @Builder, иначе может появиться сообщение об ошибке.
5. Нелегко отлаживать
Большинству из нас обычно нравится использовать отладку для отладки проблем с позиционированием, но код, сгенерированный ломбоком, отлаживать непросто.
6. Сильные зависимости между вышестоящими и нижестоящими системами
Если клиент fegin, предоставленный в восходящей системе, использует ломбок, то нижестоящая система также должна использовать ломбок, иначе будет сообщено об ошибке, а вышестоящая и нижестоящая системы образуют сильную зависимость.
Как мы должны выбирать?
У ломбока есть плюсы и минусы, как нам выбрать?
Лично рекомендуется сделать наиболее разумный выбор, исходя из реальной ситуации проекта.
- Если вы участвуете в новом проекте, а вышестоящая и нижестоящая системы являются новыми, в настоящее время рекомендуется использовать ломбок, поскольку это может значительно повысить эффективность разработки.
- Если вы участвуете в старом проекте и раньше не использовали ломбок, рекомендуется не использовать его позже, поскольку стоимость модификации кода высока. Если вы использовали ломбок раньше, рекомендуется использовать его позже, поскольку стоимость модификации кода высока.
- На самом деле, пока вводится пакет jar, могут быть: принуждение товарищей по команде к установке подключаемого модуля идеи, обновление JDK влияет на функцию, есть некоторые ямы, а вышестоящая и нижестоящая системы сильно зависят по этим проблемам..
- Две проблемы плохая читаемость кода и неудобная отладка, на мой взгляд, невелики, потому что ломбок обычно используется на javabeans, логика этого класса относительно проста, и многие коды можно понять с первого взгляда, даже если вы можете угадать 7 или 8 баллов без устранения причины проблемы.
Последнее слово (пожалуйста, обратите внимание, не проституируйте меня по пустякам)
Если эта статья оказалась для вас полезной или поучительной, отсканируйте QR-код и обратите внимание, ваша поддержка — самая большая мотивация для меня продолжать писать.
Попросите в один клик три ссылки: лайк, вперед и смотреть.