使类和成员的可访问性最小化
?????? 模塊之間只能通過api進行通信,也就是通過暴露出來的預先定義好的函數進行通信,一個模塊不需要,也不應該知道其他模塊的內部工作情況,這個概念叫做信息隱藏,,也叫封裝,是軟件設計的重要的基本原則之一。之所以重要,是因為它能有效地解除各模塊的耦合關系,使得各模塊能夠進行獨立的開發,測試,優化,使用,和修改。
?可能的四種訪問級別有:
????? ? 一 ? 私有的(private)
?????? 二?? 公有的(public)
?????? 三?? 受保護的(protect)
?????? 四?? 包級私有的(package-private)
?????? 大多數人開始學java,只了解前三種,而不了解第四種,簡單介紹一下第四種-包級私有?
? 對于Java類的訪問修飾符有public, 包級私有兩種
???????在項目pro下包和類的組織如下:
?????? Java代碼 ?
?????? public? class?Student{}
?????? 那么為公有,這時候兩個包mypack1和mypack2的Test類都能夠訪問到Student類
????? 如果Student的聲明為
?????? class?Student{}
?????? 那么為包級私有,這時候在同一個包下的mypack1才能訪問Student類,mypack2不行。
?????? 這就是包級私有。
?對于頂層的類和接口,只有兩種可能的訪問級別:包級私有的和公有的。如果用public修飾了頂層類或接口,那么它就是公有的,否則就是包級私有的。
重要的幾個原則:
?????? 一???如果類或者接口能過被做成包級私有的,那么他就應該被做成包級私有的。
?????? 通過把類或者接口做成包級私有,實際上它就成了這個包中實現的一部分,而不是該包導出的API的一部分。這樣,在以后對它進行修改,替換,或者刪除的時候,就不會擔心影響到現有的客戶端,如果把它做成公有的,那么你永遠都要考慮兼容性去維護它。
????? 二??? 一個包級私有的頂層類只是在某一個類的內部被用到,那么就考慮使它成為唯一使用它的那個類的私有嵌套類。
????? 這樣可以把它的訪問范圍從包中的所有類縮小到了使用它的那個類。
????? 三?? 當訪問級別從包級私有變成保護級別時,會大大增強其訪問性。
???? 受保護成員是類的導出的API的一部分,必須得到永久支持。因此少用受保護的成員。
??? 四?? 如果方法覆蓋了超類的一個方法,子類的訪問級別就不允許低于超類中的訪問級別。
?????這樣可以確保任何可使用超類實例的地方也可以使用子類,否則編譯器會報錯。
???? 特殊的情形是:如果一個類實現了一個接口,那么接口中的所有類方法在這個類中必須都是公有的,原因是接口的所有方法都隱含著公有訪問級別。
??? 五??實例域絕對不能是公有的。
?????? 什么是實例域?通俗來說,人是動物的一個實例,那么人的所有成員,比如說手,腳,身高等具體的鍵值都是他的實例域。
?????? 原因是如果一旦使這個域,就相當于放棄了對存儲在這個域的值進行限制的能力,同時,當這個域被修改時,你也失去的對他采取行動的能力。
?????? 靜態域也適用于這個規則。但只有一種特殊情況——通過公有的靜態final域去暴露常量。
?????? 六? 類不能擁有公有的靜態final數組域,原因是客戶端能夠改變數組的內容!
????????public static int[] values={1,2,3};//potential security hole!
?????? 應該這么做:
?????????????? private static int[] FIRST_VALUES={1,2,3};
??????????????public static final List<Integer> values=Collections.unmodifiableList(Arrays.asList(FIRST_VALUES));
?????? 或者
?????????????? private static int[]?FIRST_VALUES={1,2,3};
?????????????? public static final int[] values(){
????????????????????? return? FIRST_VALUES.clone();
??????????}????
???? 如何選擇就要看你的需求
????
???? 這是我結合書本總結出來的一些方法,希望它能幫助大家不斷優化自己的代碼!
??????
?
總結
以上是生活随笔為你收集整理的使类和成员的可访问性最小化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PolarFS :一个用于共享存储云数据
- 下一篇: 对象锁和类锁