[英]How to update a field in a immutable object
假設以下類別:
@Immutable
public final MyMessageClass {
private String message;
private Date dateLastChange;
private String identifier;
public MyClass(final String message){
this.message = message;
dataLastChange = new Date();
}
public Date lastChange() {
return new Date(dateLastChange.getTime());
}
public String messageValue(){
return message;
}
}
一旦建立了此類的對象,
MyMessageClass myMessageObject = new MyMessageClass("Once upon a time ...");
一旦完成操作,
logger.info("The message is{}",myMessageObject.messageValue());
logger.info("The last change was done on {}",myMessageObject.lastChange());
期望從某個地方(例如,遠程服務)獲取identifier
並將其附加到message
。 但是,如果我做這樣的事情:
myMessageObject.setIdentifier(identifier);
我應該打破了對象的不變性能力。 如果是這樣,那么更新identifier
字段的最佳方法是如何避免執行新的構造函數調用(從而創建一個新對象)?
所以問題僅僅是因為您想先記錄一些東西? 構造對象后不能這樣做嗎?
或者,您可以使用構建器模式,類似這樣。 請注意最終實例字段-即使沒有注釋,此類的實例也將是不可變的。
@Immutable
public final MyMessageClass {
private final String message;
private final Date dateLastChange;
private final String identifier;
public MyClass(final MyMessageClass.Builder builder){
this.message = builder.message;
this.dataLastChange = builder.dataLastChange;
this.identifier = builder.identifier;
}
public Date lastChange() {
return new Date(dateLastChange.getTime());
}
public String messageValue(){
return message;
}
public String identifier(){
return identifier;
}
public static final class Builder {
private String message;
private final Date dateLastChange = new Date();
private String identifier;
public Builder message(final String message) {
this.message = message;
return this;
}
public String message() {
return message;
}
public Builder identifier(final String identifier) {
this.identifier = identifier;
return this;
}
public String identifier() {
return identifier;
}
public Date lastChange() {
return new Date(dateLastChange.getTime());
}
public MyMessageClass build() {
return new MyMessageClass(this);
}
}
}
然后,您可以逐步構建對象的內容。
MyMessageClass.Builder builder = new MyMessageClass.Builder().message("Once upon a time ...");
logger.info("The message is{}", builder.message());
logger.info("The last change was done on {}",builder.lastChange());
String identifier = // get the identifier from somewhere
MyMessageClass message = builder.identifier(identifier).build();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.