使用龙目岛从现有对象构建对象

2022-08-31 06:37:04

假设我有一个龙目岛注释类,如

@Builder
class Band {
   String name;
   String type;
}

我知道我可以做到:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();

有没有一种简单的方法可以使用现有对象作为模板并更改其属性之一来创建Foo对象?

像这样:

Band nirvana = Band.builder(rollingStones).name("Nirvana");

我在龙目岛文档中找不到这个。


答案 1

您可以使用该参数为实例提供方法。toBuildertoBuilder()

@Builder(toBuilder=true)
class Foo {
   int x;
   ...
}

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();

文档中

如果使用@Builder生成生成器来生成您自己的类的实例(除非将@Builder添加到不返回您自己的类型的方法中,否则总是如此),则可以使用@Builder(toBuilder = true)在名为toBuilder()的类中生成实例方法;它会创建一个新的生成器,该生成器从此实例的所有值开始。

免责声明:我是龙目岛开发者。


答案 2

有没有一种简单的方法可以使用现有对象作为模板并更改其属性之一来创建Foo对象?(强调我的)

如果您真的想更改单个属性,那么有一种更好,更有效的方法:

@With
class Band {
   String name;
   String type;
}

Band nirvana = rollingStones.withName("Nirvana");

凋零不会产生垃圾,但它只能改变一个字段。要更改许多字段,您可以使用

withA(a).withB(b).withC(c)....

并产生大量的垃圾(所有中间结果),但比更有效,更自然。toBuilder

注意:旧版本的龙目岛使用了注释。请参阅文档开头@Wither


推荐