2009-09-09 36 views
2

兩個學期前,我有一個教授,誰說:JavaBeans的設計如何與信息隱藏一致?

你們當中有些人已經被告知要始終包括所有私有實例變量的setter和getter方法。我說這破壞了信息隱藏,並且經常導致系統不能執行不變量。

現在,這聽起來正確。但是不包括這些類型的setter/getters是創建JavaBeans的核心部分嗎?如果是這樣,爲什麼?如果不是,我對JavaBeans有什麼誤解?

+0

快速回答:告訴我「JavaBeans需要getter和setter」的人是錯誤的。 – Pops 2009-09-11 19:03:04

回答

1

Java Bean類中不需要Getters和Setter。所需要的就是該類必須是公共的,它必須有一個公共的無參數構造函數,並且它必須實現Serializable。但是,爲了在使用bean時自動發現變量,必須按照標準命名約定(getVarname,setVarname ...)提供getter和setter。

在任何情況下,您只希望在外部可見只有在您的班級以外才能看到業務的變量。

0

它通常很簡單,你暴露setter/getters變量你需要使外部可見,並且你不暴露setters/getters變量其他人有任何業務知道。

0

你的教授是對的。你不想盲目地爲所有實例變量創建getter和setter。你想在需要的地方創建它們。

如果您有一個BankAccount類,其中有一個balance實例變量,如果您希望能夠檢查和設置天平,則爲其創建getter和setters是有意義的。

即使在這裏有信息隱藏 - 以封裝實現的形式。如果它是double,那麼獲取者「double getBalance()」可以簡單地返回底層實例變量的值,或者如果它是變量的實現選擇,則它可以返回從BigDecimal派生的值,或者它可以調用遠程Web服務並返回結果。所以,getter/setter仍然允許實現變化,因此不會違反封裝(並且通過擴展,JavaBeans也不會)。

JavaBeans爲您做了什麼是定義一個接口(getXXX(), setXXX()),用於獲取和設置用戶通常想要檢查或更改的類的屬性。如果你的班級有不被視爲「財產」的信息,則不需要公開它。例如,假設BankAccount類具有用於驗證提款的實例變量。如果客戶端不需要訪問或修改它,那麼爲它創建一個getter或setter是沒有意義的。

1

您可能需要閱讀Why getter and setter methods are evil

你可能會說反對, 「但 約JavaBeans的?」他們呢?你當然可以在不使用 的getter和setter的情況下創建JavaBeans。 BeanCustomizer,BeanInfoBeanDescriptor類別全部針對 而存在。JavaBean的 規格設計師扔的getter/setter 成語成圖片,因爲他們 認爲這將是一個簡單的方法來 迅速做出豆東西,你可以 你在學習做怎麼辦呢 權。不幸的是,沒有人這樣做。

訪問者被單獨創作的一種方式 標記某些屬性,這樣一 UI-Builder程序或同等可能 識別它們。你不應該自己調用這些方法。他們 存在一個自動化的工具使用。 此工具使用Class類中的自檢API 來查找方法 並從方法 名稱中推斷 的某些屬性的存在。在實踐中,這個基於內省的成語 還沒有制定出 。這使得代碼極其複雜和程序化。 程序員不理解數據 抽象實際上調用 訪問器,因此,代碼不易維護。