對象導論系列 被隱藏的具體實現 將程式員按角色分為類創建者和客戶端程式員。 客戶端程式員的目標是收集各種用來快速實現應用開發的類。 類創建者的目標是構建類,這種類必須向客戶端暴露必須的服務,而隱藏其她部分。為什麼呢?因為加以隱藏,那麼客戶端程式員將不能訪問她,意味著類創建者可以任意修改被隱藏的部分, ...
對象導論系列---被隱藏的具體實現
將程式員按角色分為類創建者和客戶端程式員。
客戶端程式員的目標是收集各種用來快速實現應用開發的類。
類創建者的目標是構建類,這種類必須向客戶端暴露必須的服務,而隱藏其她部分。為什麼呢?因為加以隱藏,那麼客戶端程式員將不能訪問她,意味著類創建者可以任意修改被隱藏的部分,而不用擔心對其她人造成影響。被隱藏的部分通常代表類內部脆弱的部分,她們很容易被粗心的或不知內情的客戶端所毀壞,因此將實現隱藏起來可以減少Bug。
在任何相互關係中,具有關係所涉及的各方都遵守的邊界是什分重要的。當創建一個類庫時,就建立了與客戶端程式員之間的關係,他們同樣也是程式員,他們是使用你的類庫來構建應用、或者構建更大類庫的程式員。如果所有類成員對任何人是可用的,那麼客戶端程式員就可以對類做任何事情,而不受任何約束。即使你希望客戶端程式員不要直接操作你的類中的某些成員,但如果沒有訪問控制,將無法阻止些事發生。口說無用,只能用代碼來約束。
訪問控制第一個存在的原因:讓客戶端程式員無法觸及她們不應觸及的部分-----這些部分對數據類型內部操作是必須的,但並不是用戶解決特定問題所必須的介面一部分。迪米特法則其中一個思想就是讓客戶端只使用必須的介面,即最少能解決問題的介面。
訪問控制每二個存在的原因:允許類庫設計者可以改變類內部的工作方式而不用擔心會影響客戶端程式。
Java用三個關鍵字定義訪問邊界:
- Private:表示除類型創建者和類型內部方法之外任何人都不能訪問的元素;
- Public:表示對任何人都可以訪問;
- Protected:表示父類的導出類或同包內成員可以訪問;預設即是包訪問許可權;