
在软件开发中,对象的创建和管理是核心任务。Lombok 的 @Builder 注解为我们提供了一种优雅且可读性高的方式来构建复杂对象。然而,当我们需要“修改”一个已经创建的对象时,传统的做法通常是使用 Setter 方法。但这种方式在以下场景中会遇到挑战:
针对上述挑战,Lombok 提供了一个强大的解决方案:@Builder(toBuilder=true)。这个特性允许我们在不直接修改原始对象的前提下,基于现有对象创建一个新的 Builder 实例,该 Builder 会预填充原始对象的所有属性值。随后,我们可以利用这个 Builder 仅修改我们关心的部分属性,最终构建出一个全新的对象实例。这种模式本质上是一种“复制构造”并修改的过程,而非原地修改。
要启用此功能,只需在你的类上添加 @Builder(toBuilder=true) 注解。当这个注解存在时,Lombok 会为你的类生成一个额外的 toBuilder() 方法。调用这个方法将返回一个预填充了当前对象所有属性值的 Builder 实例。
示例代码:
我们以一个简单的 A 类为例,演示如何使用此功能。为了更好地体现不可变性,我们通常会结合 @Value 注解(Lombok 的 @Value 会自动生成所有字段的 private final 声明、Getter、equals、hashCode 和 toString 方法,并且不生成 Setter)。
import lombok.Builder;
import lombok.Value;
@Value // 自动生成不可变对象所需的构造器、Getter、equals、hashCode、toString
@Builder(toBuilder = true) // 启用Builder模式,并生成toBuilder()方法
public class A {
String name;
long value;
}现在,我们来看如何在实际代码中利用 toBuilder() 方法来“修改”对象:
public class BuilderModificationDemo {
public static void main(String[] args) {
// 1. 使用 Builder 创建原始对象 'a'
var a = A.builder()
.name("test-name")
.value(1234L)
.build();
System.out.println("原始对象 a: " + a); // 输出:A(name=test-name, value=1234)
// 2. 使用 toBuilder() 方法基于 'a' 创建一个新的 Builder
// 这个 Builder 已经预填充了 'a' 的所有属性值
// 3. 在新的 Builder 上修改 'value' 属性,并构建新对象 'b'
var b = a.toBuilder() // 获取一个预填充了 'a' 属性的 Builder
.value(4321L) // 只修改 value 属性
.build(); // 构建新的对象 'b'
System.out.println("修改后的新对象 b: " + b); // 输出:A(name=test-name, value=4321)
// 验证原始对象 'a' 是否未被修改
System.out.println("原始对象 a (再次): " + a); // 输出:A(name=test-name, value=1234)
}
}运行结果:
原始对象 a: A(name=test-name, value=1234) 修改后的新对象 b: A(name=test-name, value=4321) 原始对象 a (再次): A(name=test-name, value=1234)
从输出结果可以看出,原始对象 a 的值并未发生改变,而我们成功创建了一个新的对象 b,它继承了 a 的大部分属性,并对 value 属性进行了更新。
Lombok 的 @Builder(toBuilder=true) 提供了一种优雅且强大的模式,用于在保持对象不可变性的同时,实现对其属性的“修改”。通过生成一个可预填充现有对象数据的 Builder,它极大地简化了基于现有对象创建新实例并进行部分属性更新的复杂性。这种模式是构建高质量、可维护、并发安全代码库的有力工具。在设计不可变数据结构时,强烈推荐考虑使用此特性。
以上就是利用 Lombok @Builder 实现对象的高效“修改”与不可变性维护的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号