使用lombok从现有对象构建对象

Mus*_*afa 65 java lombok

可以说我有一个类似于lombok的注释类

@Builder
class Band {
   String name;
   String type;
}
Run Code Online (Sandbox Code Playgroud)

我知道我能做到:

Band rollingStones = Band.builder().name("Rolling Stones").type("Rock Band").build();
Run Code Online (Sandbox Code Playgroud)

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

就像是:

Band nirvana = Band.builder(rollingStones).name("Nirvana");
Run Code Online (Sandbox Code Playgroud)

我在lombok文档中找不到这个.

Roe*_*ker 141

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

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

Foo f0 = Foo.builder().build();
Foo f1 = f0.toBuilder().x(42).build();
Run Code Online (Sandbox Code Playgroud)

文档:

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

免责声明:我是一名lombok开发者.

  • @Mustafa还有`@ Wither`,它对于单个字段更改更有效:`Foo f1 = f0.withX(42)`. (9认同)
  • @MGhostSoft我显然以创建新对象为目标。因此,随着不可变对象的使用越来越多,我们非常常见。++×对于更改单个字段,最好使用@Wither。超过两个,`toBuilder`胜出。请参阅下面的答案。 (2认同)
  • 对于零字段(即没有任何更改的对象副本),“@Wither”根本不起作用,但“.toBuilder().build()”可以。 (2认同)

maa*_*nus 28

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

如果你真的想要改变一个属性,那么有一个更好,更有效的方法:

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

Band nirvana = rollingStones.withName("Nirvana");
Run Code Online (Sandbox Code Playgroud)

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

withA(a).withB(b).withC(c)....
Run Code Online (Sandbox Code Playgroud)

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