2012-02-22 46 views
8

我使用Builder模式爲我的項目的幾個類(多個參數,一些必需的,一些可選等)。這些類是不可變的(沒有setter,對於集合getters深度複製)。構建模式和持久性

我現在試圖使用持久性框架將這些對象存儲在數據庫中,該框架使用默認構造函數+ setter構造對象。它不喜歡我的建造者!

我不想降低設置到POJO並失去當前設計(靈活性,不變性,施工安全性)的優勢。

我會歡迎任何關於在這種情況下可以使用的解決方法的反饋(我可以包裝每個類,但這會使類的數量增加一倍,我寧願避免這樣做)。

其中一個post實際上指出,作爲Builder模式的特定缺點。

編輯

一個answer建議使用私有構造/ setter方法,但是,只有當類的字段不是最終的,這不是我的情況下工作。

最後編輯

感謝所有。
我認爲將是我最後的解決方案看起來像這樣和正常工作(根據記錄,我使用MongoDB的+嗎啡):

class AClass { 
    private final String aField; 
    private final AClass() { 
     aField = ""; 
    } 
    //Standard builder pattern after that - no setters (private or public) 
} 
+4

你不能包含setter和默認構造函數,但使它們是私有的? – DaveJohnston 2012-02-22 15:24:46

+0

好問題 - 我會檢查一下 – assylias 2012-02-22 15:25:20

+0

我知道Hibernate可以使用私有setter和構造函數,只是想知道在你的具體情況下是否有任何反對。 – DaveJohnston 2012-02-22 15:27:04

回答

6

正如我在我的評論說:你可以包括一個默認的構造函數和所有需要的制定者,但使他們私密。這樣你可以保持對象的不變性,但是像Hibernate這樣的ORM將能夠在需要時訪問方法/構造函數。

其他人也可以使用反射訪問這些方法,但他們也可以使用反射訪問私有成員變量。所以添加私有方法並沒有真正的缺點。

+1

如果這些字段不是最終的,那麼這是有效的。但是,如果他們是那麼我不能使用默認的構造函數/私人setters明顯的原因。 – assylias 2012-02-22 16:35:07

+3

如果持久性框架使用反射訪問私有構造函數,那麼它應該能夠直接設置類字段。即使這些字段是最終的,這也是有效的。 – TDJoe 2012-02-22 16:48:20

+1

將字段設置爲final是顯然使Object成爲不可變的一部分,但是如果沒有用於改變對象的公共方法,是否需要字段是最終的?除了確保你不會自己修改這些值,而是自己在課堂內部的方法中修改這些值呢? – DaveJohnston 2012-02-22 17:05:19