2015-07-13 92 views
1

我有一個service A,它偵聽來自Queue的消息,並調用另一個service B來獲取某些值,假定爲val1 ... x。我應該讓對象變化嗎?

假設我的實體是

Entity 
|- val1 
|- val2 
| 
... val1n 

值從兩個service B填充假設在實體x瓦爾斯。 服務電話service A在計算一些值並填充實體中的其他字段後。

建模的Entity

[1]做實體不變,並盡一切更新到實體副本的所有值1的可能方法... X,使一個新的對象。

[2]使實體部分不可變,如聲明val1 ... x final和其他非final,因此我可以使用setters來設置它們的值。

編輯:[3]保持傳遞生成器對象,當所有值val1 ... n已填充調用build()函數。編輯2:[4]有兩個單獨的對象(私有內部)不可變 - val1 ... x和不可變的valx..n。每次有一些更新發生在valx ..n我將創建新的可變對象的副本,並引用不可變的對象。

+0

方法2是合適的,你應該儘量讓所有的字段都是可變的,這會導致你的對象在執行過程中變得不穩定。但不一定是所有的領域。但通常建議儘可能讓實體變爲可變的,因爲你可能不會預見到任何可能的原因,有些第三方可以修改你的對象並使其不穩定 – kuhajeyan

+0

兩個不同的線程,兩個不同的領域,爲什麼不可變? – SMA

+0

@SMA可能是因爲閱讀像線程安全等不可變對象的優點的偏見。我想知道什麼時候應該放棄不變性。 –

回答

2

如果我理解正確,你願意在一個服務中創建對象,填充一些字段,而不是將它傳遞給另一個服務,並填充其中的其他服務?在此之後,對象是完整的?

如果是的話,我會用生成器圖案,填充builer的領域,一旦完成 - 構建不可變對象

+0

假設我在服務調用期間創建了一個「實體對象」。現在,當我填充其他字段時,我必須複製我的新構建器對象中的所有以前的字段'val 1 ... x'。這是我的方法'1' –

1

製作service B返回一個不可變值對象(姑且稱之爲ExtendedEntityInformation),然後從使用的值service A和那個對象來創建你的不可變的Entity。您甚至可以將ExtendedEntityInformation對象存儲在您的Entity中,如果需要,可以在Entity上實施獲取者,並將其委託給ExtendedEntityInformation中的獲取者。