天天看點

要在公有類而非公有域中使用通路方法

要在公有類而非公有域中使用通路方法

  • 公有域 :域就是類中的成員變量,有時也叫字段,屬性都是同一個意思。公有域就是能在其它類中直接通路的域,也就是帶有域。
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;
    }
}
           

那麼,對類中的資料域的通路級别應該如何設計?

  • 解決

    如果類的資料域可在它所在的包外部進行通路,就提供通路方法,這樣可以保留該類内部表示的靈活性。如果公有類暴露了它的資料域,要想将來想改變公有類的内部資料接口,那是不太可能的事情了,因為使用公有類的資料域已經遍布整個系統中了;

    對于公有類有一個約定,公有類永遠都不應該暴露可變的域。

  • 結論

    公有類永遠都不應該暴露可變的域,有時候會需要用包級私有的或者私有的嵌套類來暴露域,無論這個類的域是可變的還是不可變的。