1.為什麼要使類和成員可訪問性最小化
它可以有效地解除組成系統的各模組之間的耦合關係,使得這些模組可以獨立的開發 測試 最佳化 使用 理解和修改.提高軟體的可重用性
2.成員的存取層級
私人(private):只有在聲明該成員的頂層類內部才可以訪問這個成員
包級私人(package-private):聲明該成員的包內部的任何類都可以訪問這個成員(預設存取層級)
受保護的(protected):聲明該成員的類的子類可以訪問該成員
公有的(public)在任何地方都可以訪問該成員
3.類具有公有的靜態final數組域,或者返回這種域的存取方法,這幾乎總是錯誤的
如果類具有這種方法,用戶端將能夠修改數組中的內容
例如
public static final Thing[] VALUES ={...};
修正:a.使公有數組變成私人的,並增加一個公有的不可變列表
private static final Thing[] VALUES={...}; public static final List<Thing> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
b.使數組變成私人的,並返回一個私人數組的備份
private static final Thing[] PRIVATE_VALUES={...}; public static final Thing[] values(){ return PRIVATE_VALUES.clone(); }
盲點:
資訊隱藏(封裝):模組之間只通過他們的API進行通訊,一個模組不需要知道其他模組的內部工作情況
儘可能地使每個類或者成員不被外界訪問(如果包為包級公有,那麼你就有責任永遠支援他,以保持他們的相容性)
受保護的成員應該盡量少用
不能為了測試,將類 介面或者成員編程包的匯出的API的一部分
執行個體域絕不能是公有的
final域要麼包含基本類型的值,要麼包含指向不可變對象的引用.如果final域包含可變對象的引用,它便具有非final域的所有缺點
長度非零的數組總是可變的