2015-06-10 17 views
0

通常我會喜歡我所有的POJO都是不可變的(當然,只包含final字段,因爲Java理解不變性)。但是對於我目前的項目,一個不變的模式是我需要從POJO中改變單個字段。在這種情況下使用不可變的POJO似乎很麻煩。不可改變的pojos和單場變化的通用模式

你將如何去POJO的一堆領域和每個領域,你應該能說「請給我一個這個POJO的副本,但這一個領域改變」?

大加在這裏將是我可以與可組合函數一起使用的東西。 「從這個不可改變的pojo開始,然後基本上將它推向一堆UnaryOperators,並讓我回到新的不可改變的pojo」。

回答

2

是的,這是一個相當普遍的模式 - 通常帶有一串帶with前綴的方法。每個with*法「改變」一個字段,所以你可以有:

Person jon = new Person("Jon", "Skeet"); 
Person holly = jon.withFirstName("Holly"); // Holly Skeet 

你可以連續呼叫在一起,太:

Person fred = jon.withAge(...).withFirstName("Fred").withJob(...); 

請注意,如果你最終在一個POJO切換K場有N個字段,您將創建K個對象並需要K * N個作業。

實現通常只需要調用一個大的構造與現有的字段值和新的事:

public Person withFirstName(String newFirstName) { 
    return new Person(newFirstName, lastName, job, age, ...); 
} 

我使用術語「僞突變」爲這種方法 - 這是一種聽起來有點像變異的方法,但它更像是創建一個克隆,變異克隆,然後以「凍結」狀態返回給你。

+0

該死的你可以給我簽名嗎?什麼是正式名稱(如果有的話);從來不知道這個名字(這不是一個花哨的建設者)? – kolossus

+0

@ kolossus:不,這不是一個建造者模式 - 我不知道一般模式的名稱;根據我的編輯我稱這些方法僞mutators,但這只是*我的名字爲他們。 –

+0

在我看來,它更多的是原型的變體(因爲每個對象都可以創建自己的可變克隆)。 – Gal