Java Lombok toBuilder()方法是否创建字段的深度副本
我在对象实例上使用Java Lombok toBuilder()方法是否创建字段的深度副本,java,lombok,Java,Lombok,我在对象实例上使用toBuilder()创建一个生成器实例,然后使用build方法创建新实例。原始对象有一个列表,新对象引用的是同一个列表还是它的副本 @Getter @塞特 @AllArgsConstructor 公共班级图书馆{ 私人书目; @生成器(toBuilder=true) 公共图书馆(最终书目){ 这本书=书; } } lib2=lib1.toBuilder().build(); lib2图书是否会引用与lib1图书相同的列表?是的,@Builder(toBuilder=tru
toBuilder()
创建一个生成器实例,然后使用build方法创建新实例。原始对象有一个列表,新对象引用的是同一个列表还是它的副本
@Getter
@塞特
@AllArgsConstructor
公共班级图书馆{
私人书目;
@生成器(toBuilder=true)
公共图书馆(最终书目){
这本书=书;
}
}
lib2=lib1.toBuilder().build();
lib2图书是否会引用与lib1图书相同的列表?是的,@Builder(toBuilder=true)
注释不执行对象的深度复制,只复制字段的引用
List<Book> books = new ArrayList<>();
Library one = new Library(books);
Library two = one.toBuilder().build();
System.out.println(one.getBooks() == two.getBooks()); // true, same reference
List books=new ArrayList();
图书馆一=新图书馆(书籍);
库2=1.toBuilder().build();
System.out.println(一个.getBooks()==两个.getBooks());//正确,相同的参考
您可以使用一个简单的技巧手动复制收藏:
List<Book> books = new ArrayList<>();
Library one = new Library(books);
Library two = one.toBuilder()
.books(new ArrayList<>(one.getBooks))
.build();
System.out.println(one.getBooks() == two.getBooks()); // false, different refs
List books=new ArrayList();
图书馆一=新图书馆(书籍);
库2=1.toBuilder()
.books(新数组列表(一个.getBooks))
.build();
System.out.println(一个.getBooks()==两个.getBooks());//错误,不同的参考
实际上,您可以使用其他映射工具从现有对象创建新对象
例如com.fasterxml.jackson.databind.ObjectMapper
@AllArgsConstructor
public static class Book
{
private String title;
}
@NoArgsConstructor
@AllArgsConstructor
@Getter
public static class Library
{
private List<Book> books;
}
ObjectMapper objectMapper = new ObjectMapper(); //it's configurable
objectMapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false );
objectMapper.configure( SerializationFeature.FAIL_ON_EMPTY_BEANS, false );
List<Book> books = new ArrayList<>();
Library one = new Library( books );
Library two = objectMapper.convertValue( one, Library.class );
System.out.println( one.getBooks() == two.getBooks() ); // false, different refs
@allargsconstuctor
公共静态类书
{
私有字符串标题;
}
@诺尔格构装师
@AllArgsConstructor
@吸气剂
公共静态类库
{
私人书目;
}
ObjectMapper ObjectMapper=新的ObjectMapper()//它是可配置的
objectMapper.configure(在未知属性上反序列化feature.FAIL,false);
configure(空bean上的SerializationFeature.FAIL\u,false);
List books=new ArrayList();
图书馆一=新图书馆(书籍);
库二=objectMapper.convertValue(一,Library.class);
System.out.println(一个.getBooks()==两个.getBooks());//错误,不同的参考
它可以很容易地包装成一些实用方法,在整个项目中使用,比如
ConvertUtils.clone(rollingStones,Band.class)
。这应该是相当清楚的,因为没有提到深度复制,这是不。请修改您的标题。是龙目山。