1. Знакомство с Ломбоком
во-первыхLombok
Это подключаемый модуль прикладного инструмента для Java IDE, инструмент, который может помочь нам упростить и устранить часть обязательного, но раздутого кода Java с помощью простых аннотаций, таких как конструкторы свойств, геттеры, сеттеры, равные, хэш-код, метод toString. В сочетании с IDE с использованием соответствующих аннотаций соответствующие методы могут быть сгенерированы при компиляции исходного кода. Официальный адрес:https://projectlombok.org/
.
Хотя приведенные выше общие методы могут быть сгенерированы IDE, ломбок более лаконичен и удобен Эффект, которого можно добиться, заключается в том, что нет необходимости писать какие-то общие методы в исходном коде, но это поможет нам сгенерировать эти методы в файл байт-кода, сгенерированный компиляцией. , это магия ломбока.
2. Установка
2.1 Установка плагина
IDE, в основном используемая автором, - это идея Intellij, и компилятор должен быть в
preference->plugins->Browse repositories
Найдите ломбок, затем установите плагины, это займет некоторое время. Скриншот автора установлен.
ломбок плагин
2.2 Добавить пакет jar
Добавьте в проект пакет jar от lombok.Автор использует maven, поэтому в файл pom добавляются следующие зависимости. См. Официальный сайт для использования Gradle.
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.16</version>
<scope>provided</scope>
</dependency>
3. Используйте
lombok в основном работает через аннотации.Подробные аннотации см.Lombok features.
With Lombok:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
public class UserEntity implements Serializable {
private long userId;
private String userName;
private String sex;
}
После компиляции:
import java.beans.ConstructorProperties;
import java.io.Serializable;
public class UserEntity implements Serializable {
private long userId;
private String userName;
private String sex;
public long getUserId() {
return this.userId;
}
public String getUserName() {
return this.userName;
}
public String getSex() {
return this.sex;
}
public void setUserId(long userId) {
this.userId = userId;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setSex(String sex) {
this.sex = sex;
}
public boolean equals(Object o) {
if(o == this) {
return true;
} else if(!(o instanceof UserEntity)) {
return false;
} else {
UserEntity other = (UserEntity)o;
if(!other.canEqual(this)) {
return false;
} else if(this.getUserId() != other.getUserId()) {
return false;
} else {
Object this$userName = this.getUserName();
Object other$userName = other.getUserName();
if(this$userName == null) {
if(other$userName != null) {
return false;
}
} else if(!this$userName.equals(other$userName)) {
return false;
}
Object this$sex = this.getSex();
Object other$sex = other.getSex();
if(this$sex == null) {
if(other$sex != null) {
return false;
}
} else if(!this$sex.equals(other$sex)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof UserEntity;
}
public int hashCode() {
int PRIME = true;
int result = 1;
long $userId = this.getUserId();
int result = result * 59 + (int)($userId >>> 32 ^ $userId);
Object $userName = this.getUserName();
result = result * 59 + ($userName == null?43:$userName.hashCode());
Object $sex = this.getSex();
result = result * 59 + ($sex == null?43:$sex.hashCode());
return result;
}
public String toString() {
return "UserEntity(userId=" + this.getUserId() + ", userName=" + this.getUserName() + ", sex=" + this.getSex() + ")";
}
@ConstructorProperties({"userId", "userName", "sex"})
public UserEntity(long userId, String userName, String sex) {
this.userId = userId;
this.userName = userName;
this.sex = sex;
}
}
Вот аннотации, которые я часто использую.
-
val, используемый перед локальными переменными, эквивалентен объявлению переменной final
-
@Value
Используемый в классах, это неизменяемая форма @Data, которая эквивалентна добавлению окончательных объявлений к свойствам, предоставляя только методы получения, а не методы установки. -
@Data
@ToString, @EqualsAndHashCode, @Getter для всех свойств, комбинации @Setter и @RequiredArgsConstructor для всех нефинальных свойств, обычно мы используем эту аннотацию.
-
@NoArgsConstructor конструктор без аргументов
-
@AllArgsConstructor конструктор всех аргументов
-
@ToString
Сгенерируйте метод toString. По умолчанию будут выведены имя класса и все атрибуты. Атрибуты будут выведены по порядку, разделенные запятыми. -
@EqualsAndHashCode
По умолчанию все непереходные и нестатические поля используются для создания методов equals и hascode, и вы можете указать, какие свойства использовать. -
@Getter / @Setter
Как упоминалось выше, обычно нет необходимости добавлять эту аннотацию при использовании @data. Его можно применять к классам и свойствам.При размещении в классе методы Getter/Setter будут созданы для всех нестатических свойств.При размещении в свойствах методы Getter/Setter будут созданы для этого свойства. И может указать уровень доступа методов Getter/Setter. -
@NonNull, добавление этой аннотации к параметру метода автоматически проверит, является ли параметр пустым в методе.Если он пуст, будет сгенерировано NPE (NullPointerException).
-
@Cleanup
Автоматически управлять ресурсами, используемыми перед локальными переменными, автоматически очищать ресурсы перед выходом из текущей области переменных и автоматически генерировать код, такой как try-finally, для закрытия потока. -
@Log
Различные типы объектов журнала генерируются в соответствии с разными аннотациями, но все имена экземпляров являются журналами, и существует 7 необязательных классов реализации:1). @Log4j
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);
2). @Log4j2
private static final org.apache.logging.log4j.Logger log = org.apache.logging.log4j.LogManager.getLogger(LogExample.class);
3). @Slf4j
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
4). @XSlf4j
private static final org.slf4j.ext.XLogger log = org.slf4j.ext.XLoggerFactory.getXLogger(LogExample.class);
5). @CommonsLog
private static final org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
6). @JBossLog
private static final org.jboss.logging.Logger log = org.jboss.logging.Logger.getLogger(LogExample.class);
7). @Log
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());
По умолчанию именем логгера будет имя класса с аннотацией @Log. Конечно, это также может быть названо индивидуально через параметр темы, например
@XSlf4j(topic="reporting")
.
4. Принцип
Ломбок в основном действует через аннотации, аннотации введены из jdk5, и есть два способа парсинга.
Первый — это синтаксический анализ во время выполнения,@Retention(RetentionPolicy.RUNTIME)
, Определите политику хранения аннотации, чтобы аннотацию можно было получить путем отражения.
Другой — синтаксический анализ во время компиляции, который имеет два механизма.
-
Инструмент обработки аннотаций, apt был создан на основе JDK5, JDK7 был помечен как просроченный и не рекомендуется для использования, и был полностью удален в JDK8. Начиная с JDK6, его можно заменить подключаемым API обработки аннотаций. Есть две причины для поддается замене. Все API находятся в нестандартном пакете com.sun.mirror, они не интегрированы в javac и их нужно запускать дополнительно.
-
Pluggable Annotation Processing API
lombok реализован таким образом.На основе JSR 269, он был добавлен начиная с JDK6.В качестве альтернативы apt решает две проблемы apt.При выполнении javac будет вызывать программу, реализующую API, так что мы можно скомпилировать Чтобы внести некоторые улучшения, процесс выполнения javac выглядит следующим образом:
поток выполнения javac
5. Резюме
В этой статье в основном объясняется введение и использование ломбока. Введены некоторые часто используемые аннотации ломбока, которые значительно упрощают нашу работу по разработке и простоту кода. Конечно, ломбок не поддерживает перегрузку конструкторов с несколькими параметрами, в конце концов, инструменты есть инструменты, и я не думаю, что найдется идеальный инструмент для всех. Наконец, я лично все же рекомендую этот плагин, все-таки я ленивый, 😆.