在新的Java項目中,我嘗試儘可能多地應用最佳實踐。我遇到的問題是不變性。雖然我理解了這個概念,並且已經建立了一些不可變類,但現在我來到了一個類,我認爲將它作爲一個可變類是更合適的。如何限制對可變或不可變方法的訪問?
主要問題是我想在某些情況下隱藏類的可變部分,以便在我的情況下,MVC的視圖層不能直接修改對象,但必須通過其控制器。
我認爲有2種方法做到這一點:
創建界面「東西」,它有它的所有不可變的方法(只讀),並創建一個接口「MutableThing」它有setter方法。
將所有方法放在一個接口中,並通過包裝對象,如Collections.unmodifiableList(obj)方法來限制對變異方法的訪問,以便在訪問變異方法時拋出異常。
我更喜歡第一個,因爲我認爲它更乾淨,設計更好,但我有一個問題。我在「Thing」接口中添加了addListener(l)和removeListener(l),以便視圖層可以將自己註冊爲某些模型對象的偵聽器。但在「Thing」界面中使用這兩種方法時,它自己就不再有意義了。爲什麼如果沒有辦法實際改變數據,一個接口就能夠註冊監聽器來發出數據變化的信號?我可以將這些方法放在「MutableThing」接口中,但視圖層只能訪問「Thing」接口,並且不能將自己註冊爲偵聽器。
這不工作的原因僅僅是因爲聽衆,視圖層實際上負責將自己註冊爲模型上的監聽器嗎?如果控制器可以以某種方式做到這一點(可以訪問「MutableThing」),那麼就不會有問題,但我不知道如何實現它。
你會建議什麼?
謝謝!
通過將接口與接口分隔開來是什麼意思?這看起來如何? – letmaik 2009-10-20 15:20:05
我的意思是說,你不要在'Thing'或'MutableThing'接口中放置'addListener'和'removeListener'方法,但是你需要爲監聽器功能使用一個單獨的接口(例如'Observer' /'Observable') 。 – Jesper 2009-10-20 19:42:47