使類和成員的可訪問性最小化

2022-07-23 12:15:21 字數 1742 閱讀 7739

將設計良好的元件與設計不佳的元件區分開來的最重要的因素是,隱藏內部資料和其他實現細節的

程度。乙個設計良好的元件隱藏了它的所有實現細節,乾淨地將它的 api 與它的實現分離開來。然後,

元件只通過它們的 api 進行通訊,並且對彼此的內部工作一無所知。這一概念,被稱為資訊隱藏或封

裝,是軟體設計的基本原則

資訊隱藏很重要有很多原因,其中大部分**於它將組成系統的元件分離開來,允許它們被獨立地

開發,測試,優化,使用,理解和修改。這加速了系統開發,因為元件可以並行開發。它減輕了維護的

負擔,因為可以更快速地理解元件,除錯或更換元件,而不用擔心損害其他元件。雖然資訊隱藏本身並

不會導致良好的效能,但它可以有效地進行效能調整:一旦系統完成並且分析確定了哪些元件導致了性

能問題(條目 67),則可以優化這些元件,而不會影響別人的正確的元件。資訊隱藏增加了軟體重用,

因為松耦合的元件通常在除開發它們之外的其他環境中證明是有用的。最後,隱藏資訊降低了構建大型

系統的風險,因為即使系統不能執行,各個獨立的元件也可能是可用的

經驗法則很簡單:讓每個類或成員盡可能地不可訪問。 換句話說,使用盡可能低的訪問級別,與

你正在編寫的軟體的對應功能保持一致。

公共類的例項字段很少情況下採用 public 修飾(詳見第 16 條) 如果乙個例項字段是非 final

的,或者是對可變物件的引用,那麼通過將其公開,你就放棄了限制可以儲存在字段中的值的能力。這

意味著你放棄了執行涉及該字段的不變數的能力。另外,當字段被修改時,就放棄了採取任何操作的能

力,因此帶有公共可變欄位的類通常不是執行緒安全的 。即使乙個欄位是 final 的,並且引用了乙個不可

變的物件,通過將其公開,你放棄了切換到乙個新的內部資料表示的靈活性,而該字段並不存在。

同樣的建議適用於靜態字段,但有乙個例外。 假設常量是類的抽象的乙個組成部分,你可以通過

public static final 字段暴露常量。 按照慣例,這些欄位的名字由大寫字母組成,字母用下劃線分隔(詳

見第 68 條)。 很重要的一點是,這些字段包含基本型別的值或對不可變物件的引用(詳見第 17 條)。

包含對可變物件的引用的字段具有非 final 欄位的所有缺點。 雖然引用不能被修改,但引用的物件可以

被修改,並會帶來災難性的結果

請注意,非零長度的陣列總是可變的,所以類具有公共靜態 final 陣列字段,或返回這樣乙個字段

的訪問器是錯誤的。 如果乙個類有這樣的字段或訪問方法,客戶端將能夠修改陣列的內容。 這是安全

public static final thing values = ;

要小心這樣的事實,一些 ide 生成的訪問方法返回對私有陣列欄位的引用,導致了這個問題。 有兩

種方法可以解決這個問題。 你可以使公共陣列私有並新增乙個公共的不可變列表:

private static final thing private_values = ;

public static final listvalues =

collections.unmodifiablelist(arrays.aslist(private_values));

或者,可以將陣列設定為 private,並新增乙個返回私有陣列拷貝的公共方法:

private static final thing private_values = ;

public static final thing values()

使類和成員的可訪問性最小化

要區別設計良好的模組與設計不好的模組,最重要的因素在於,這個模組對於外部的其他模組而言,是否隱藏其內部資料和其他實現細節。設計良好的模組會隱藏所有的實現細節,把它的api與它的實現清晰的隔離開來。然後,模組之間只通過它們的api進行通訊,乙個模組不需要 知道其他模組的內部工作情況。這被稱為資訊隱藏或...

使類和成員的可訪問性最小化

規則1 盡可能的使得每個類或者成員不被外界訪問。頂層的類或者介面,只能是包級私有的或者共有的,如果可能,應該是他們盡可能的包級私有。這樣當你更新 的時候不會影響到它的使用者。否則就需要永遠支援它。如果乙個類只是在某乙個類中被使用,應該考慮將它做成私有巢狀類。成員的控制方法 private 私有的,只...

使類和成員的可訪問性最小化

規則1 盡可能的使得每個類或者成員不被外界訪問。頂層的類或者介面,只能是包級私有的或者共有的,如果可能,應該是他們盡可能的包級私有。這樣當你更新 的時候不會影響到它的使用者。否則就需要永遠支援它。如果乙個類只是在某乙個類中被使用,應該考慮將它做成私有巢狀類。成員的控制方法 private 私有的,只...