天天看点

要在公有类而非公有域中使用访问方法

要在公有类而非公有域中使用访问方法

  • 公有域 :域就是类中的成员变量,有时也叫字段,属性都是同一个意思。公有域就是能在其它类中直接访问的域,也就是带有域。
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;
    }
}
           

那么,对类中的数据域的访问级别应该如何设计?

  • 解决

    如果类的数据域可在它所在的包外部进行访问,就提供访问方法,这样可以保留该类内部表示的灵活性。如果公有类暴露了它的数据域,要想将来想改变公有类的内部数据接口,那是不太可能的事情了,因为使用公有类的数据域已经遍布整个系统中了;

    对于公有类有一个约定,公有类永远都不应该暴露可变的域。

  • 结论

    公有类永远都不应该暴露可变的域,有时候会需要用包级私有的或者私有的嵌套类来暴露域,无论这个类的域是可变的还是不可变的。