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)

。这应该是相当清楚的,因为没有提到深度复制,这是不。请修改您的标题。是龙目山。