對象導論之被隱藏的具體實現

被隱藏的具體實現
  將程序開發人員按照角色分爲類創建者(那些創建新數據類型的程序員)和客戶端程序員(那些在其應用中使用數據類型的類消費者)是大有裨益的。客戶端程序員的目標是收集各種用來實現快速應用開發的類。類創建者的目標是構建類,這種類只向客戶端程序員暴露必需的部分,而隱藏其他部分。爲什麼要這樣呢?因爲如果加以隱藏,那麼客戶端程序員將不能夠訪問它,者意味着類創建者可以任意修改被隱藏的部分,而不用擔心對其他任何人造成影響。被隱藏的部分通常代表對象內部脆弱的部分,它們很容易被粗心的或不知內情的客戶端程序員所毀壞,因此將實現隱藏起來可以減少程序bug。
  在任何互相關係中,具有關係所涉及的各方都遵守的邊界是十分重要的事情。當創建一個類庫時,就建立了與客戶端程序員之間的關係,他們同樣也是程序員,但是他們是使用你的類庫來構建應用、或者構建更大的類庫的程序員。如果所有的類成員對任何人都是可用的,那麼客戶端程序員就可以對類做任何事情,而不受任何約束。即使你希望客戶端程序員不要直接操作你的類中的某些成員,但是如果沒有任何訪問控制,將無法阻止此時發生。所有東西都將赤裸裸地暴露於世人面前。
  因此,訪問控制的第一個存在原因就是讓客戶端程序員無法觸及他們不應該觸及的部分——這些部分對數據類型的內部操作來說是必需的,但並不是用戶解決特定問題所需的接口的一部分。這對客戶端程序員來說其實是一項服務,因爲他們可以很容易地看出哪些哪些東西對他們來說很重要,而哪些東西可以忽略。
  訪問控制的第二個存在原因就是允許庫設計者可以改變類內部的工作方式而不用擔心會影響到客戶端程序員。例如,你可能爲了減輕開發任務爲以某種簡單的方式實現了某個特定類,但稍後發現你必須改寫它才能使其運行得更快。如果接口和實現可以清晰地分離並得以保護,那麼你就可以輕而易舉地完成這項工作。
  Java用三個關鍵字在類的內部設定邊界:public、private、protected。這些方位指定詞(access specifier)決定了緊跟其後被定義的東西可以被誰使用。public表示緊跟其後的元素對任何人都是可用的,而private這個關鍵字表示除類型創建者和類型的內部方法之外的任何人都不能訪問的元素。private就像你與客戶端程序員之間的一堵磚牆,如果有人試圖訪問private成員,就會在編譯時得到錯誤信息。protected關鍵字與private作用相當,差別僅在於繼承的類可以訪問protected成員,但是不能訪問private成員。稍後將會對繼承進行介紹。
  Java還有一種默認的訪問權限,當沒有使用前面提到的任何訪問指定詞時,它將會發揮作用。這種權限通常被稱爲包訪問權限,因爲在這種權限下,類可以訪問在同一個包(庫構件)中的其他類的成員,但是在包之外,這些成員如同指定了private一樣。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章