为了账号安全,请及时绑定邮箱和手机立即绑定

Lombok toBuilder() 方法是否创建字段的深层副本

Lombok toBuilder() 方法是否创建字段的深层副本

浮云间 2023-02-23 14:43:28
我toBuilder()在对象实例上使用来创建构建器实例,然后使用 build 方法来创建新实例。原始对象有一个列表,新对象是否引用了同一个列表或它的副本?@Getter@Setter@AllArgsConstructorpublic class Library {    private List<Book> books;    @Builder(toBuilder=true)    public Library(final List<Book> books){         this.books = books;    }}Library lib2  = lib1.toBuilder().build();lib2 书籍会引用与 lib1 书籍相同的列表吗?
查看完整描述

3 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

是的,@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


查看完整回答
反对 回复 2023-02-23
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您可以使用一个简单的技巧手动制作集合的副本:


    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


查看完整回答
反对 回复 2023-02-23
?
慕神8447489

TA贡献1780条经验 获得超1个赞

实际上你可以做的是使用其他映射工具从现有对象创建一个新对象。


例如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

它可以很容易地包装在一些实用方法中,以便在整个项目中使用,比如ConvertUtils.clone(rollingStones, Band.class)



查看完整回答
反对 回复 2023-02-23
  • 3 回答
  • 0 关注
  • 220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信