new*_*ner 3 java immutability lombok
Person我有一个用 Lombok 注释的域类@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;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用 Java 15。
您还可以使用 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"));
Run Code Online (Sandbox Code Playgroud)
一般来说,我不确定使对象不可变是否真的是一个好主意。除了 UUID 之外的每个变量似乎都可能在未来发生变化。