精选文集Java开发

Java 中的 Builder 模式 & 链式调用

2024-02-27  本文已影响0人  _浅墨_

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 方法支持方法链调用。

虽然两者都与构建对象实例有关,但作用不同,可以同时使用它们来提高代码的简洁性和可读性。

上一篇 下一篇

猜你喜欢

热点阅读