Java Lombok@Data和@Builder组合

Java Lombok@Data和@Builder组合,java,lombok,Java,Lombok,嗨,我有一个关于@Data和@Builder组合的问题。 让我们想象一下这样的情况:我有一个必须被创建和修改的实体。 首先,我创建它: Entity entity = Pojo.builder() .a("1") .b("2") .build(); 在一些操作之后,我必须添加c字段并修改a。 我该怎么做? 这样做是否正常: entity.setA("01"); entity.setC("3"); repo.save(entity); 有更好的变体吗?没关系。 建筑->对象创建,创建后设置->

嗨,我有一个关于@Data和@Builder组合的问题。 让我们想象一下这样的情况:我有一个必须被创建和修改的实体。 首先,我创建它:

Entity entity = Pojo.builder()
.a("1")
.b("2")
.build();
在一些操作之后,我必须添加c字段并修改a。 我该怎么做? 这样做是否正常:

entity.setA("01");
entity.setC("3");
repo.save(entity);
有更好的变体吗?

没关系。 建筑->对象创建,创建后设置->对象设置


构建器设计模式的目的是将复杂对象的构造与其表示分离。它是四种设计模式之一。

您可以使用setter,在实体上始终使用@Accessorschain=true来创建对象和设置字段。chain选项为我们提供了返回该值的setter

Entity entity= new Entity().setName("Name").setBalance(10);
entity.setName("newName");
注意,chain默认为true,但为了清晰起见,我显式地设置了它

对于没有get或set前缀的访问者,请使用@accessorfluent=true


你可以在实体上使用@Accessors关键字。这让我想知道,如果你对可变性没问题,那么构建器到底给了你什么呢。@Michael,我相信同样的,构建器的目的是提供一个不可变的对象及其使用方法,这样我们就不会在对象形成后对其进行变异。我个人认为,不可变性和流畅的接口是两个独立的关注点。这可能是因为您发现最佳实践的不变性。但这将取决于您是否使用了流畅的构建器。例如,与经典构造函数和Fluent builder模式相比,使用javabean模式创建对象可能是最糟糕的解决方案。在创建对象新实体和时间调用设置器之间,对象可能处于不一致的状态。最好认为object created=consistent/finished object.@CodeScale时间调用设置器您的对象可能处于不一致的状态,实际上并不正确。因为OP需要两个选项,所以我认为最好使用相同的模式。@CodeScale你能解释一下为什么你认为它是最糟糕的解决方案吗?为什么构建器模式适合这个casemotable对象?在他的示例中,他不需要B的setter。顺便说一下,javabean way是唯一一种创建对象并填充它的创建模式。。。正如我所说的,最好在创建时让连贯的对象可变或不可变。Josh bloch的《有效java》一书对此进行了解释
Entity entity= new Entity().name("Name").balance(10);