要區別設計良好的模組與設計不好的模組,最重要的因素在於,這個模組對於外部的其他模組而言,是否隱藏其內部資料和其他實現細節。
設計良好的模組會隱藏所有的實現細節,把它的api與它的實現清晰的隔離開來。然後,模組之間只通過它們的api進行通訊,乙個模組不需要
知道其他模組的內部工作情況。這被稱為資訊隱藏或者封裝。
由於我們實現了很好的封裝,只提供若干的api供客戶端**來訪問,非api涉及的類和成員,客戶端**是無法直接使用的,這樣我們在修改
這些非api涉及的類和成員,我們就不用擔心客戶端**使用了它們,造成我們修改了這些**,從而影響了客戶端**的行為。總之一句話,
合理的使用封裝,為模組之間的松耦合而努力。
訪問控制機制(access mode)決定了類,介面,成員的可訪問性。正確的使用訪問修飾符,對於實現資訊隱藏是非常關鍵的。
第一條規則:盡可能使每個類和成員不被外界訪問。盡可能使用最小的訪問級別。
對於類和介面,只有兩種可能的訪問級別:包級私有的和公有的。使用public修飾符宣告了類和介面,那麼這個類和介面就是公有的;如果省略
public,那麼這個類就是包級私有的。通過把類或者介面做成包級私有的,它實際上成了這個包的實現的一部分,而不是該包匯出的api的一部分。
以後對它的修改,只需要擔心這個包內的其他類對它的使用,而不用擔心客戶端**對它的使用。特別,如果乙個類只是在某乙個類的類的內部
被使用到,那麼我們可以考慮將這個類做成需要它的類的私有巢狀類(私有內部類),而不是包級私有類,這樣就進一步降低了訪問級別。
對於成員(五類:域,初始化塊,構造器,方法,內部類、內部介面),有四種可能的訪問級別:
私有的 private
包級私有的 預設
受保護的 protected
公有的 public
應該把所有其他的成員都變成私有的,只有當同乙個包中的另乙個類真正需要訪問乙個成員時,才應該刪除private修飾符,使該成員變成包級私有的。
從包級私有變成受保護的 ,會大大增強這個成員的可訪問性。受保護的成員應該盡量少用。
例項域(非static的域)決不能是公有的。如果域是非final的,或者域是final的,但是引用的是乙個可變物件,那麼這個域一旦成為公有的,就放棄了
對儲存在這個域中的值進行限制的能力。包含公有可變域的類並不是執行緒安全的。
對於靜態域也建議盡量少使用公有的。但是一種情況除外,如果這個類提供了一些常量,那麼可以通過公有的靜態final域來暴露這些常量。通常,這些域
的名稱由大寫字母組成,單詞之間下劃線隔開。但是這些公有的靜態final域,要麼是基本型別的值,要麼引用不可變物件的引用。如果final域指向的是可變
物件的引用,那麼它就具有非final域的所有缺點,雖然引用本身不能被修改,但是它引用的物件卻可以被修改-----這將導致災難性的後果。
使類和成員的可訪問性最小化
規則1 盡可能的使得每個類或者成員不被外界訪問。頂層的類或者介面,只能是包級私有的或者共有的,如果可能,應該是他們盡可能的包級私有。這樣當你更新 的時候不會影響到它的使用者。否則就需要永遠支援它。如果乙個類只是在某乙個類中被使用,應該考慮將它做成私有巢狀類。成員的控制方法 private 私有的,只...
使類和成員的可訪問性最小化
規則1 盡可能的使得每個類或者成員不被外界訪問。頂層的類或者介面,只能是包級私有的或者共有的,如果可能,應該是他們盡可能的包級私有。這樣當你更新 的時候不會影響到它的使用者。否則就需要永遠支援它。如果乙個類只是在某乙個類中被使用,應該考慮將它做成私有巢狀類。成員的控制方法 private 私有的,只...
使類和成員的可訪問性最小化
將設計良好的元件與設計不佳的元件區分開來的最重要的因素是,隱藏內部資料和其他實現細節的 程度。乙個設計良好的元件隱藏了它的所有實現細節,乾淨地將它的 api 與它的實現分離開來。然後,元件只通過它們的 api 進行通訊,並且對彼此的內部工作一無所知。這一概念,被稱為資訊隱藏或封 裝,是軟體設計的基本...