java - Lombok Immutable:构造参数的深拷贝
问题描述
如何获得一个构造函数,将构造函数参数的副本分配给字段,以使实例真正不可变?下面的类有@Value
注释,但这不是不可变的,因为它的属性不是:(问题不是特定于 immutableCollections
的,我只是用它来演示可变 DS。我正在寻找任何可变 bean 来代替List
这里, ,比如说来自图书馆,不在我的控制范围内)
@Value
class ImmutableBean {
List<String> props;
}
@Test
void checkImmutability() {
var props = new ArrayList<String>();
props.add("abc");
var immutableBean = new ImmutableBean(props);
System.out.println(immutableBean.getProps()); // abc
props.add("pqr");
System.out.println(immutableBean.getProps()); // abc pqr
}
解决方案
对于 Singleton 类,您需要使用@Singular
Collection 字段并将其标记为private final
import lombok.*;
import java.util.ArrayList;
import java.util.List;
@Value
@AllArgsConstructor
@Getter
@Builder
class ImmutableBean {
@Singular
private final List<String> props;
public static void main(String[] args) {
List<String> props = new ArrayList<>();
props.add("abc");
ImmutableBean immutableBean = ImmutableBean.builder().props(props).build();
System.out.println(immutableBean.getProps()); // abc
props.add("pqr");
System.out.println(immutableBean.getProps()); // abc
}
}
推荐阅读
- python - 我如何 file.find("a","b","c"..... 等 "z") 和 ord("A","B","C"..... 等“Z”)在python中
- entity-framework - EFCore 在自引用对象中重复
- cloud - 谷歌云平台抢占式实例能否自动重启?
- django - django 中的 send_mail() 没有发送。命令行 sendmail 是
- animation - Godot 动画在多人游戏中无法正常工作
- java - 发送 Volley Multipart 帖子图像和参数请求时出现错误 500
- javascript - 将一个很长的字符串作为参数发送到 asmx Web 服务
- flutter - Flutter:每次访问页面时如何在底部导航栏上重新加载页面
- spring-security - 使用 Spring Security 在同一应用程序中基于 SAML2 和基于表单的登录
- node.js - 无法使用 npm start 命令启动反应应用程序