我有一个带有Lombok @Value
注解的域类@Value
,因此将其标记为不可变,有3个字段。
在我的服务层中,我调用存储库来检查此人是否存在。
如果它确实存在,我需要从数据库中提取Person
对象并更新money
字段。
因为它是不可变的,所以不能这样做。我读了一些文章,发现这可以用构建器模式来完成。
我可能需要在我的updatePerson()
类中创建一个Person
,但不确定如何实现。还是我还需要做点别的?
Person.java
@Value
@Builder
public class Person {
private final UUID id;
private final String job;
private final BigDecimal money;
}
我正在使用Java 15。
发布于 2021-12-09 14:51:39
您还可以使用lombok的另一个特性,它不需要使用构建器。它被称为@With
,使用此注释将创建不可变的setter,这意味着setter返回一个新对象,该对象具有旧对象的属性,但要更改的属性除外。
@Value
public class Person {
/* You don't need to write final if you are using @Value. Lombok will make the variables final for you.
In theory you do not even need to write private,
because Lombok makes variables private by default instead of package private.*/
private UUID id;
private String job;
@With
private BigDecimal money;
}
Person newPerson = person.withMoney(new Big decimal("10"));
一般来说,我不确定使对象不可变是否真的是一个好主意。除了UUID之外,每个变量看起来都可能在未来发生变化。
发布于 2021-12-09 12:50:45
使用Lombok
@Value
@Builder(toBuilder = true)
public class Person {
private final UUID id;
private final String job;
private final BigDecimal money;
}
personObjectFromDatabase.toBuilder().setMoney(...).build()
或
在这种情况下,您可以使用Builder
模式:
public class Person {
private final UUID id;
private final String job;
private final BigDecimal money;
public static class PersonBuilder {
private UUID id;
private String job;
private BigDecimal money;
public PersonBuilder(Person defaultPerson){
this.id = defaultPerson.getId();
this.job = defaultPerson.getJob();
this.money = defaultPerson.getMoney();
}
public PersonBuilder withId(UUID id) {
this.id = UUID;
return this;
}
public PersonBuilder withJob(String job) {
this.job = job;
return this;
}
public PersonBuilder withMoney(BigDecimal money) {
this.money = money;
return this;
}
public Person build() {
return new Person(id, job, money);
}
}
}
使用此生成器,如下所示:
Person person = new Person.PersonBuilder(personObjectFromDatabase)
.withMoney(...)
.build();
或
您只需创建一个copyWith()
方法:
public class Person {
...
public Person copyWith(BigDecimal money) {
return new Person(this.id, this.job, money);
}
}
发布于 2021-12-09 13:06:34
类是不可变的;您永远不能更改该类实例的值。
相反,必须创建类的新实例。
不要编写构建器;您已经在使用Lombok,只需使用@Builder
注释,Lombok就会为您创建一个构建器。
编辑:您正在使用构建器注释。您正在寻找的解决方案似乎如下:
必须创建类的新实例。
https://stackoverflow.com/questions/70296361
复制