兩個學期前,我有一個教授,誰說:JavaBeans的設計如何與信息隱藏一致?
你們當中有些人已經被告知要始終包括所有私有實例變量的setter和getter方法。我說這破壞了信息隱藏,並且經常導致系統不能執行不變量。
現在,這聽起來正確。但是不包括這些類型的setter/getters是創建JavaBeans的核心部分嗎?如果是這樣,爲什麼?如果不是,我對JavaBeans有什麼誤解?
兩個學期前,我有一個教授,誰說:JavaBeans的設計如何與信息隱藏一致?
你們當中有些人已經被告知要始終包括所有私有實例變量的setter和getter方法。我說這破壞了信息隱藏,並且經常導致系統不能執行不變量。
現在,這聽起來正確。但是不包括這些類型的setter/getters是創建JavaBeans的核心部分嗎?如果是這樣,爲什麼?如果不是,我對JavaBeans有什麼誤解?
Java Bean類中不需要Getters和Setter。所需要的就是該類必須是公共的,它必須有一個公共的無參數構造函數,並且它必須實現Serializable。但是,爲了在使用bean時自動發現變量,必須按照標準命名約定(getVarname,setVarname ...)提供getter和setter。
在任何情況下,您只希望在外部可見只有在您的班級以外才能看到業務的變量。
它通常很簡單,你暴露setter/getters變量你需要使外部可見,並且你不暴露setters/getters變量其他人有任何業務知道。
你的教授是對的。你不想盲目地爲所有實例變量創建getter和setter。你想在需要的地方創建它們。
如果您有一個BankAccount
類,其中有一個balance
實例變量,如果您希望能夠檢查和設置天平,則爲其創建getter和setters是有意義的。
即使在這裏有信息隱藏 - 以封裝實現的形式。如果它是double
,那麼獲取者「double getBalance()
」可以簡單地返回底層實例變量的值,或者如果它是變量的實現選擇,則它可以返回從BigDecimal
派生的值,或者它可以調用遠程Web服務並返回結果。所以,getter/setter仍然允許實現變化,因此不會違反封裝(並且通過擴展,JavaBeans也不會)。
JavaBeans爲您做了什麼是定義一個接口(getXXX(), setXXX()
),用於獲取和設置用戶通常想要檢查或更改的類的屬性。如果你的班級有不被視爲「財產」的信息,則不需要公開它。例如,假設BankAccount
類具有用於驗證提款的實例變量。如果客戶端不需要訪問或修改它,那麼爲它創建一個getter或setter是沒有意義的。
您可能需要閱讀Why getter and setter methods are evil:
你可能會說反對, 「但 約JavaBeans的?」他們呢?你當然可以在不使用 的getter和setter的情況下創建JavaBeans。
BeanCustomizer
,BeanInfo
和BeanDescriptor
類別全部針對 而存在。JavaBean的 規格設計師扔的getter/setter 成語成圖片,因爲他們 認爲這將是一個簡單的方法來 迅速做出豆東西,你可以 你在學習做怎麼辦呢 權。不幸的是,沒有人這樣做。訪問者被單獨創作的一種方式 標記某些屬性,這樣一 UI-Builder程序或同等可能 識別它們。你不應該自己調用這些方法。他們 存在一個自動化的工具使用。 此工具使用
Class
類中的自檢API 來查找方法 並從方法 名稱中推斷 的某些屬性的存在。在實踐中,這個基於內省的成語 還沒有制定出 。這使得代碼極其複雜和程序化。 程序員不理解數據 抽象實際上調用 訪問器,因此,代碼不易維護。
快速回答:告訴我「JavaBeans需要getter和setter」的人是錯誤的。 – Pops 2009-09-11 19:03:04