我有一個Java應用程序,其中域控制器與UI分離。問題是這些控制器可以返回域對象,並且可以將域對象作爲參數。製作不可修改的對象
其中一些返回的域對象是可變的,這就是我想要阻止的。我希望UI(或未來的UI)無法直接修改域而不訪問控制器。
我嘗試了兩種選擇:
在我確信,每個類實現的「不可修改的」 接口只含有干將第一個。如果我需要返回一個對象到UI,我返回了它的'Unmodifiable'接口。這樣UI才能查看獲取者。 這個問題,他們仍然可以很容易地轉換到原始對象和訪問獲得。起初,我認爲這種安全水平足夠好,但事情發生了,有人不小心鑄造了一些物體,並以不正確的方式使用它們,並破壞了完整性。
在第二個我試圖提供不可修改的包裝爲每個可能返回的對象。但問題是這些返回的對象可以用作控制器中方法的參數,因此它們需要在控制器中解包。我試圖製作
uwrap()
方法包 - 私有,但是我必須將每個特定的包裝類與控制器放在同一個包中,這有點不方便。
編輯:3TH選項:
- (與感謝vic)在第三選項的目的是通過一種不可修改包裝包裹,但不能被此包裝包裝除去。每個Unmodifiable都鏈接到它在Hashmap中的可修改對象。所以'解包'是通過獲取鏈接到不可修改對象的可修改對象來完成的。
有誰知道或有如何使物體不可修改,使他們能夠通過控制器返回,並有可能使他們再次修改的時候都回傳給控制器的一些想法?
如果你使參數最終? – 2012-02-18 14:10:49
有些參數不能是最終的,因爲它們需要在域邏輯中進行更改。 – Xochipilli 2012-02-18 14:17:36