文章目录
- Lombok
-
- 1.介绍
- 2.主要注解
- [2.1如何使用 Lombok](#2.1如何使用 Lombok)
-
- 2.1.1添加依赖
- [2.1.2 使用Lombok注解](#2.1.2 使用Lombok注解)
- 2.1.3Lombok的其他常用注解
Lombok
1.介绍
Lombok 是一个 Java 库,它可以通过注解的方式减少 Java 代码中的样板代码。Lombok 自动为你生成构造函数、getter、setter、equals、hashCode、toString 方法等,从而避免了手动编写这些重复性的代码。这不仅减少了出错的机会,还让代码看起来更加简洁。
Lombok是一个编译阶段的库,能够帮我们自动补充代码,在Java程序运行阶段并不起作用。
2.主要注解
@Data:
- 等价于 @ToString, @EqualsAndHashCode, @Getter,@Setter,@RequiredArgsConstructor.
- 用于生成:必要参数的构造方法、getter、setter、toString、equals 和 hashcode 方法
@Getter / @Setter:
- 分别用于生成所有的 getter 和 setter 方法
- 可以作用于整个类,也可以作用于特定的字段
@NoArgsConstructor:
- 生成一个无参构造方法
@AllArgsConstructor:
- 生成一个包含所有实例变量的构造器
@RequiredArgsConstructor:
- 生成包含所有被 final 修饰符修饰的实例变量的构造方法
- 如果没有final的实例变量,则自动生成无参数构造方法
@ToString / @EqualsAndHashCode:
- 用于生成 toString 和 equals/hashCode 方法
- 这两个注解都有exclude属性,通过这个属性可以定制toString、hashCode、equals方法
2.1如何使用 Lombok
2.1.1添加依赖
在 Maven 的 pom.xml 文件中添加 Lombok 依赖:
java
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
</dependency>
2.1.2 使用Lombok注解
在 Java 类中使用 Lombok 提供的注解
java
import lombok.Data;
@Data
public class User {
private String name;
}
java
public class Test {
public static void main(String[] args) {
User user = new User();
user.setName("jackson");
System.out.println(user.getName());
System.out.println(user.toString());
System.out.println(user.hashCode());
User user2 = new User();
user2.setName("jackson");
System.out.println(user.equals(user2));
}
}
执行结果如下:
注:Lombok只能帮助我们生成无参数构造方法和全参数构造方法,其他定制参数的构造方法无法生成。
2.1.3Lombok的其他常用注解
@Value
该注解会给所有属性添加final,给所有属性提供getter方法,自动生成toString、hashCode、equals
通过这个注解可以创建不可变对象。
java
@Value
public class Customer {
Long id;
String name;
String password;
}
Test
java
public class CustomerTest {
public static void main(String[] args) {
Customer c1 = new Customer(1L, "jackson", "123");
System.out.println(c1);
System.out.println(c1.getId());
System.out.println(c1.getName());
System.out.println(c1.getPassword());
System.out.println(c1.hashCode());
Customer c2 = new Customer(1L, "jackson", "123");
System.out.println(c1.equals(c2));
}
}
执行结果如下:
@Builder
GoF23种设计模式之一:建造模式
建造模式(Builder Pattern)属于创建型设计模式。
用于解决对象创建时参数过多的问题。
它通过将对象的构造过程与其表示分离,使得构造过程可以逐步完成,而不是一次性提供所有参数。
建造模式的主要目的是让对象的创建过程更加清晰、灵活和可控。
简而言之,建造模式用于:
- 简化构造过程:通过逐步构造对象,避免构造函数参数过多。
- 提高可读性和可维护性:让构造过程更加清晰和有序。
- 增强灵活性:允许按需配置对象的不同部分。
这样可以更方便地创建复杂对象,并且使得代码更加易于理解和维护。
建造模式的代码如下
java
// 建造模式
public class Person {
// 属性
private final String name;
private final int age;
private final String email;
// 私有的全参数构造方法
private Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getEmail() {
return email;
}
public static PersonBuilder builder() {
return new PersonBuilder();
}
// 静态内部类
public static class PersonBuilder {
private String name;
private int age;
private String email;
public PersonBuilder name(String name) {
this.name = name;
return this;
}
public PersonBuilder age(int age) {
this.age = age;
return this;
}
public PersonBuilder email(String email) {
this.email = email;
return this;
}
// 建造对象的核心方法
public Person build() {
return new Person(name, age, email);
}
}
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + ", email='" + email + '\'' + '}';
}
public static void main(String[] args) {
Person person = Person.builder()
.name("jackson")
.age(20)
.email("[email protected]")
.build();
System.out.println(person);
}
}
执行结果如下:
使用@Builder注解自动生成建造模式的代码
java
@Data
@Builder
// 建造模式
public class Person {
// 属性
private String name;
private int age;
private String email;
public static void main(String[] args) {
Person person = Person.builder()
.name("jackson")
.age(20)
.email("[email protected]")
.build();
System.out.println(person);
}
}
@Singular
@Singular注解是辅助@Builder注解的。
当被建造的对象的属性是一个集合,这个集合属性使用@Singular注解进行标注的话,可以连续调用集合属性对应的方法完成多个元素的添加。
如果没有这个注解,则无法连续调用方法完成多个元素的添加。代码如下:
java
@Data
@Builder
// 建造模式
public class Person {
// 属性
private final String name;
private final int age;
private final String email;
// Singular翻译为:单数。表示一条一条添加
@Singular("addPhone")
private final List<String> phones;
public static void main(String[] args) {
Person person = Person.builder()
.name("jackson")
.age(20)
.email("[email protected]")
.addPhone("15222020214")
.addPhone("14875421424")
.addPhone("16855241424")
.build();
System.out.println(person);
}
}
执行结果如下:
@Slf4j
Lombok 支持多种日志框架的注解,可以根据你使用的日志框架选择合适的注解。以下是 Lombok 提供的部分日志注解及其对应的日志框架:
- @Log4j:
自动生成一个 org.apache.log4j.Logger 对象。
适用于 Apache Log4j 1.x 版本。 - @Slf4j:
自动生成一个 org.slf4j.Logger 对象。
适用于 SLF4J(Simple Logging Facade for Java),这是一种日志门面,可以与多种实际的日志框架(如 Logback、Log4j 等)集成。 - @Log4j2:
自动生成一个 org.apache.logging.log4j.Logger 对象。
适用于 Apache Log4j 2.x 版本。
使用
假设我们有一个类 ExampleClass,并且我们想要使用 SLF4J 作为日志框架,我们可以这样使用 @Slf4j 注解:
java
@Slf4j
public class UserService {
public void login(){
log.info("登录验证...");
}
// 测试
public static void main(String[] args) {
UserService userService = new UserService();
userService.login();
}
}
在这个例子中,log 是一个静态成员变量,表示一个 org.slf4j.Logger 对象。Lombok 自动生成了这个日志对象,并且你可以直接使用它来进行日志记录。
选择合适的注解
选择哪个注解取决于你使用的日志框架。例如:
● 如果你使用的是 SLF4J,可以选择 @Slf4j。
● 如果你使用的是 Log4j 1.x,可以选择 @Log4j。
● 如果你使用的是 Log4j 2.x,可以选择 @Log4j2。