我有一個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我將創建新的可變對象的副本,並引用不可變的對象。
方法2是合適的,你應該儘量讓所有的字段都是可變的,這會導致你的對象在執行過程中變得不穩定。但不一定是所有的領域。但通常建議儘可能讓實體變爲可變的,因爲你可能不會預見到任何可能的原因,有些第三方可以修改你的對象並使其不穩定 – kuhajeyan
兩個不同的線程,兩個不同的領域,爲什麼不可變? – SMA
@SMA可能是因爲閱讀像線程安全等不可變對象的優點的偏見。我想知道什麼時候應該放棄不變性。 –