在 Java 中使用 Lombok 更新不可变对象?

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。

mag*_*cmn 7

您还可以使用 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 之外的每个变量似乎都可能在未来发生变化。