最小化類和成員的訪問能力

原文地址:http://leihuang.org/2014/11/17/minmize-accessibility/


信息隱藏

要想區別一個設計良好的模塊與一個設計不好的模塊,最重要的因素是,這個模塊對於外部的其它模塊而言,是否隱藏了內部的數據和其他的實現細節。換句話說,就是模塊的設計者是否對其進行了良好的封裝。

對於頂層的(非嵌套的)類和接口,它們只有2種訪問級別:包級私有(package-private)和公有(public)。如果選擇了包級私有,那麼它只是這個包的實現的一部分,而不是該包對外提供服務的API的一部分。在以後的版本中,你可以對它進行修改、替換甚至刪除,而無需擔心會傷害到現有的使用者。而如果選擇的公有的,你就有義務永遠支持它,以保持兼容性。

對於成員(域和方法),訪問級別共爲4種:

● 私有的(private)——只有該成員的頂層類中才能訪問

● 保護的(protected)——本包內的任何類和所在類的子類都可以訪問

● 公有的(public)——任何地方都可以訪問

實例域不能爲public

如果一個實例域時final,或者是一個指向可變對象的final引用,如果你將這樣的類申明爲public。那麼你就不能限制存在這個域裏面的值,也不能強制這些數據不變。同時,實例域被修改時你也不能做些什麼,所以:

classes with public mutable fields are not thread-safe.

具有公有的靜態final數組域幾乎總是錯誤的。注意這句話共有4個定語——公有的、靜態的、final的、數組。

// 這可以肯定是錯誤的
public static final Type[] VALUES = { ... };  

// 應該改成這樣
private static final Type[] PRIVATE_VALUES = { ... };  
public static final List VALUE = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

// 或者這樣寫(可能損失一點性能),前提是Type實現了克隆接口,而且你不反感克隆
private static final Type[] PRIVATE_VALUES = { ... };  
public static final Type[] values() {
      return (Type[]) PRIVATE_VALUES.clone();
}



2014-11-17 00:48:43

Brave,Happy,Thanksgiving !


發佈了142 篇原創文章 · 獲贊 104 · 訪問量 87萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章