我有一個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;
}
我正在使用 Java 15。
uj5u.com熱心網友回復:
您還可以使用 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 之外的每個變數似乎都可能在未來發生變化。
uj5u.com熱心網友回復:
使用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);
}
}
uj5u.com熱心網友回復:
類是不可變的;您永遠無法更改該類的實體的值。
相反,您必須創建該類的一個新實體。
不要寫生成器;您已經在使用 Lombok,只需使用
@Builder
注釋,Lombok 就會為您創建一個構建器。
編輯:您正在使用構建器注釋。您正在尋找的解決方案似乎是這樣的:
您必須創建該類的新實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/378270.html
