要在公有類而非公有域中使用通路方法
- 公有域 :域就是類中的成員變量,有時也叫字段,屬性都是同一個意思。公有域就是能在其它類中直接通路的域,也就是帶有域。
class Test {
private int a; // 這是一個私有域,隻能在本類通路
public int b; // 這就是一個公有域了,可以在其它類中直接通路
protected int c; // 這是保護域,這類域可以在本類及其子類,還有與在本類所在同一包下的其類中直接通路
}
-
要在公有類而非公有域中使用通路方法
舉個例子:
class User {
public String name;
public Integer old;
}
如上這樣的類絕不應該聲名為public,因為一旦聲名為了public,該類中所有的資料就全部暴露出來,并且無法改變它的資料表示法,也無法強加任何限制條件,當被通路的時候,無法采取任何輔助措施,這麼多問題,歸結原因就是因為如果類聲明不當,那麼可能會将整個資料域全部暴露給用戶端。雖然,對于可變類來說,應該用包含私有域和僅有設定方法的類代替:
class User {
private String name;
private Integer old;
public Integer getOld() {
return old;
}
public void setOld(Integer old) {
this.old = old;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
那麼,對類中的資料域的通路級别應該如何設計?
-
解決
如果類的資料域可在它所在的包外部進行通路,就提供通路方法,這樣可以保留該類内部表示的靈活性。如果公有類暴露了它的資料域,要想将來想改變公有類的内部資料接口,那是不太可能的事情了,因為使用公有類的資料域已經遍布整個系統中了;
對于公有類有一個約定,公有類永遠都不應該暴露可變的域。
-
結論
公有類永遠都不應該暴露可變的域,有時候會需要用包級私有的或者私有的嵌套類來暴露域,無論這個類的域是可變的還是不可變的。