所以我一直在閱讀Joshua Bloch的Effective Java,並注意到我在工作中實際遇到的兩點。不變性和可讀性
Point 1:使setter方法使代碼更具可讀性。 在他的例子中,我們有一個帶有可笑的巨大構造函數的類。當人們實例化課堂時,很難說出所有參數的情況。因此,他建議製作簡約構造並具有用於所有其他選項設置方法,所以不是...
MyClass的clazz所=新MyClass的(A,B,C, d,E,F,G) ;
你會寫....
MyClass的clazz所=新MyClass的(A,B, C);
clazz.setDitto(d);
clazz.setEcho(e);
clazz.setFunzies(f);
clazz.setGumballs(g);
其中,作爲一個可讀代碼的巨大支持者,我非常喜歡。
第2點:一般來說,他建議有不可變的類。他深入探討了爲什麼不可變類比擁有可能處於幾個不同狀態的類要好得多。我可以肯定地說,他把這個想法賣給了我,我迫不及待地想寫出大部分我從現在開始寫下來的類,除了不可變,除了......
當你有一個巨大的構造函數的不可變類時會發生什麼?你不能爲它設置setter方法;那會破壞不變性。我嘗試瀏覽本書的其餘部分,但我不認爲他爲此提供瞭解決方案。
有一種可能性使一次性使用setter方法,但只是一個setter方法可用於一個被認爲是不可變性的類令人沮喪的事實,即使它只是拋出一個異常如果你隨後嘗試它倍。
有沒有人有如何處理這個問題的好主意?我目前正在面對這個問題,在那裏我有一個不可變類,帶有一個巨大的構造函數,我想重構一些更具可讀性而又不破壞不變性的東西。
這似乎是一個有用的概念將有一個可變的和不可變的類派生自一個共同的抽象基地(它宣佈所有屬性的getters)。不可變類的構造函數可以接受基類的參數。不知道如何讓可變類使用讀寫屬性來影響抽象的只讀屬性,但是不需要創建實現只讀屬性的中間類。 – supercat 2010-09-02 23:30:18