美文网首页Effective Java
在公有类中使用访问方法而非公有域

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

作者: KubiL | 来源:发表于2017-05-14 18:32 被阅读0次
    class Point {
      public double x;
      public double y;
    }
    

    这种类数据是可以被直接访问的,这些类没有提供封装的功能,如果不改变API,就无法改变它的数据表示法,也无法强加任何约束条件,当域被访问的时候,无法采取任何辅助的行动,坚持面向对象程序设计的程序员对这种类深恶痛绝,认为应该用包含私有域和公有访问方法来代替。对于可变的类来说,应该用包含私有域和公有设值方法的类来代替,就是我们所说的 get和set方法。

    class Point {
        public double x;
        public double y;
    
        public Point(double x, double y) {
            this.x = x;
            this.y = y;
        }
    
        public double getX() {
            return x;
        }
    
        public double getY() {
            return y;
        }
    
        public void setX(double x) {
            this.x = x;
        }
    
        public void setY(double y) {
            this.y = y;
        }
    }
    
    

    毫无疑问,说到公有类的时候,坚持面向对象程序设计思想的看法是正确的,如果类可以在它所在的包的外部进行访问,就提供访问方法。以保留将来改变该类的内部表示方法的灵活性,如果公有类暴露了他的数据域,要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了。
    然而,如果类是包级私有的,或者是私有的嵌套类,直接暴露它的数据域并没有本质的错误——假设这些数据域确实描述了该类所提供的抽象。这种方法比访问方法的做法更不会产生视觉混淆。

    让公有类直接暴露域从来都不是种好办法,但是如果域是不可改变的,这种做法危害较小,如果不改变类的API,就无法改变这种类的表示法,当域被读取的时候,你就无法采取辅助行动,但是可以强加约束条件。

    
    public final class Time{
        private static final int HOURS_PER_DAY=24;
        private static final int MINUTES_PER_HOUR=60;
    
        public final int hour;
        public final int minute;
    
        public Time(int hour,int minute){
            if(hour < 0|| hour >= HOURS_PER_DAY){
                System.err.println("Error");
            }
            if(minute < 0|| minute >= MINUTES_PER_HOUR){
                System.err.println("Error");}
            this.hour = hour;
            this.minute = minute;
        }
    }
    

    总之,公有类永远都不应该暴露可变的域。

    相关文章

      网友评论

        本文标题:在公有类中使用访问方法而非公有域

        本文链接:https://www.haomeiwen.com/subject/hrndtxtx.html