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

时间:2017-11-02 07:12:44

标签: java lombok

假设我有一个类似

的lombok注释类
@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");

我无法在lombok文档中找到它。

3 个答案:

答案 0 :(得分:88)

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

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

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

来自the documentation

  

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

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

答案 1 :(得分:14)

  

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

如果您真的想要更改单个属性,那么可以采用更好,更有效的方式:

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

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

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

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

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

答案 2 :(得分:0)

您可能还想使用 com.fasterxml.jackson.databind.ObjectMapper

复制对象
@AllArgsConstructor
@Setter
class Band {
    String name;
    String type;
}

ObjectMapper objectMapper = new ObjectMapper(); //it's configurable
objectMapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false );
objectMapper.configure( SerializationFeature.FAIL_ON_EMPTY_BEANS, false );

Band rollingStones = new Band("Rolling Stones", "Rock Band");

Band nirvana = objectMapper.convertValue( rollingStones, Band.class);
nirvana.setName("Nirvana");

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