概要
1.使類和成員的可訪問性最小化的意義
2.類和成員的可訪問性類別
3.其他注意事項
4.最后的原則
一均唉、使類和成員的可訪問性最小化的意義
1. 概念:信息隱藏(或者"封裝")
一個模塊對外部模塊隱藏其內部數(shù)據(jù)和其他實現(xiàn)細節(jié),將它的API與它的實現(xiàn)細節(jié)清晰地隔離開來爽室,模塊之間只通過API進行通信,其他模塊不需要知道該模塊的內部工作情況悟泵。
2.?封裝的作用
(1) 有效的解除組成系統(tǒng)的各模塊之間的耦合關系,使得各個模塊可以獨立地開發(fā),測試道川,優(yōu)化蚣录,使用割择,理解和修改。
(2)?減輕程序員維護的負擔萎河。維護的模塊的時候荔泳,只需要維護單個的模塊,不用考慮其它模塊的事情虐杯,只需要考慮模塊對外提供的API玛歌。
(3) 模塊復用,可以將模塊移植到其他系統(tǒng)(模塊拆分),重復使用
(4) 優(yōu)化方便,檢測性能的時候,可以確定出是哪個模塊的問題,只需要專門針對該模塊進行優(yōu)化
二擎椰、類和成員的幾種可訪問性
1.頂層類(非嵌套)和接口支子,有兩種訪問級別,包級私有和公有的
頂層類达舒,如果是包級私有值朋,只有該包中的類才能使用它
接口,如果是包級私有巩搏,只有該包中的類能實現(xiàn)它
package test.topclass;
??? class OneClass {
}
--------------------------------------
package test.topclass;
??? interface OneInterface {
}
----------------------------------------
package test.topclass;
public class TestClass implements OneInterface{
??? public static void main(String[] args) {
??????? OneClass one = new OneClass();
??? }
}
2.私有嵌套類(或者接口)
如果一個包級私有的頂層類(或者接口)只是在某一個類的內部被用到吞歼,就應該考慮使它成為唯一使用它的那個類的私有嵌套類(或者接口)。這樣可以將它的可訪問范圍從包中的所有類縮小到了使用它的那個類
package test.privateclass;
class TopClass {
??? private interface TopInterface {
??? }
???
??? private class UserClass {
??????? private TopInterface oneInterface = new TopInterface(){};
??????? private TopClass oneClass = new TopClass();
??? }
}
3.類成員(域塔猾,方法,嵌套類和嵌套接口)稽坤,有四種可訪問級別
私有的(private) -- 只有在聲明該成員的頂層類內部才可以訪問這個成員
包級私有的(package-private) -- 聲明該成員的包內部的任何類都可以訪問這個成員丈甸。從技術上講,它被稱為"缺省(default)訪問級別",如果沒有為成員指定訪問修飾符,就采用這個訪問級別
受保護的(protected) -- 聲明該成員的類的子類可以訪問這個成員,并且,聲明該成員的包的內部的任何類也可以訪問這個成員
公有的(public) -- 在任何地方都可以訪問該成員
訪問權限??????? 類?????????包????????子類????????其他包
public??????????????√???????????√?????????? √?????????????? √
protected????????√???????????√??????????? √???????????????×
default????????????√?????????? √????????????×???????????????×
private?????????????√????????????×???????????×????????????????×
對于接口的成員尿褪,只有一種訪問級別睦擂,公有的。(下面例子是錯誤的)
package test;
public interface OneInteface {
????private int ten = 10;
????private void add();
}
三杖玲、其他注意事項
1.實例域決不能是公有的
如果域是非final的顿仇,或者是一個指向可變對象的final引用,那么一旦使這個域成為公有的摆马,就放棄了對存儲在這個域中的值進行限制的能力
2.靜態(tài)公共域只能為final修飾的基本類型或者final修飾的不可變類
假設常量構成了類提供的整個抽象中的一部分臼闻,可以通過公有的靜態(tài)final域來暴露這些常量
package test.other;
public class PublicClass {
????public static final String STRING_HELLO="HELLO";
}
final修飾引用類型的變量:test.staticpublic
3.長度非零的數(shù)組總是可變的,可被修改的
package test.other;
public class PublicArray {
??? public static final int[] VALUES = { 1, 2, 3 };
??? private static final float[] VALUES_FLOAT = {1.2f,1.3f};
??? public static float[] getFloatArray(){
??? return VALUES_FLOAT;
??? }
??? public static void main(String[] args){
??? PublicArray.VALUES[0] = 10;
??? PublicArray.getFloatArray()[0] = 10.2f;
??????? System.out.println("--------VALUE----------");
??????? for(int value:VALUES) {
??????????? System.out.println(value+"");
??????? }
??????? System.out.println("--------VALUE_FLOAT----------");
??????? for(float valueFloat:VALUES_FLOAT) {
??????????? System.out.println(valueFloat+"");
??????? }
??? }
}
package test.other;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class PublicArrayTwo {
??? private static final int[] VALUES = { 1, 2, 3 };
??? private static final float[] VALUES_FLOAT = { 1.2f, 1.3f };
??? public static final List<int[]> values() {
??? return Collections.unmodifiableList(Arrays.asList(VALUES));
??? }
??? public static final float[] getFloatArray() {
??? return VALUES_FLOAT.clone();
??? }
}
package test.other;
import java.util.List;
public class TestPublicArrayTwo {
??? public static void main(String[] args) {
??????? List<int[]> pat = PublicArrayTwo.values();
??????? if(pat.size() > 0){
??????????? int[] publicArray = pat.get(0);
??????????? for(int i = 0; i < publicArray.length; i++){
??????????? int j = publicArray[i];
??????????? System.out.println(j);
??????????? }
??????? }
??????? System.out.println("------------------------------------------------");
??????? float[] oneFloat = PublicArrayTwo.getFloatArray();
??????? for(int i = 0; i < oneFloat.length; i++){
??????? System.out.println(oneFloat[i]);
??????? }
??? }
}
四囤采、最后的原則
總而言之述呐,你應該始終盡可能地降低可訪問性。你在仔細地設計了一個最小的公有API之后蕉毯,應該防止把任何散亂的類乓搬、接口和成員變成API的一部分思犁。除了公有靜態(tài)final域的特殊情形之外,公有類都不應該包含公有域进肯。并且要確保公有靜態(tài)final域所引用的對象都是不可變的激蹲。