Java 中的 Builder 模式 & 链式调用
Builder 模式
使用 Builder 模式,比如下面的代码:
User user = new User.Builder()
.name(“test”)
.email(“test@hotmail.com”)
.nickname(“test”)
.build();
@Data 和 @Builder
@Data 和 @Builder 是 Lombok 库提供的注解,用于在 Java 类中自动生成常见的方法和模式,以减少代码的冗余。
@Data: 组合注解,包含了 @Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor。它用于标记一个类,告诉 Lombok 自动生成所有这些方法。这些方法包括 getter、setter、toString()、equals() 和 hashCode() 方法。这样可以避免手动编写这些常用方法,减少了代码的重复性。
@Builder: 这个注解用于生成一个构建器模式(Builder Pattern)的构造器。构建器模式是一种创建对象的设计模式,它通过提供一种更具表达性的方式来构建对象,尤其适用于对象具有多个可选参数的情况。使用构建器模式可以使代码更易读,而不必记住方法参数的顺序。
使用 @Builder 注解后,Lombok 将为被注解的类自动生成一个静态内部类 Builder,并在 Builder 类中为类的每个非静态字段生成对应的设置方法,使得可以使用 Builder 模式来构建对象实例。
下面是一个示例,演示如何在 Java 类中使用 @Data 和 @Builder:
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class Person {
private String firstName;
private String lastName;
private int age;
}
public class Main {
public static void main(String[] args) {
// 使用构建器模式创建 Person 对象
Person person = Person.builder()
.firstName("John")
.lastName("Doe")
.age(30)
.build();
// 打印 Person 对象的信息
System.out.println("First Name: " + person.getFirstName());
System.out.println("Last Name: " + person.getLastName());
System.out.println("Age: " + person.getAge());
}
}
在这个示例中:
Person 类使用 @Data 和 @Builder 注解,告诉 Lombok 自动生成 getter、setter、toString()、equals() 和 hashCode() 方法,以及构建器模式的构造器。
在 Main 类中,我们使用构建器模式创建了一个 Person 对象,并设置了其属性。这种方式不仅清晰易懂,而且可以在不记住参数顺序的情况下构建对象。
@Accessors(chain = true)
@Accessors(chain = true) 注解用于控制 Lombok 自动生成的 setter 方法的返回值,以此简化 Java 类的代码。当设置为 true 时,setter 方法返回的是该对象实例本身,即支持方法链调用。
当你设置 chain = true 时,Lombok 生成的 setter 方法将返回对象本身(即this),而不是 void。
这样可以实现“链式”调用风格,即可以连续调用 setter 方法,每次调用都在同一个对象上设置属性。
@Data
@Accessors(chain = true)
public class User {
private String name;
private int age;
}
使用以上注解后,你可以这样链式调用setter方法:
User user = new User().setName(“Alice”).setAge(30);
使用 Lombok 可以大大减少代码,使得类定义更加简洁。但是需要注意的是,使用 Lombok 需要在编译环境中正确配置该库,并且在 IDE 中也需要安装相应的插件以支持这些注解。
@Builder @Accessors(chain = true) 区别
区别:
@Builder 注解用于生成 Builder 模式相关的代码,使得可以通过 Builder 模式来构建对象实例。
@Accessors(chain = true) 注解用于控制生成的 setter 方法的返回值,使得 setter 方法支持方法链调用。
虽然两者都与构建对象实例有关,但作用不同,可以同时使用它们来提高代码的简洁性和可读性。