• 第14条:在公有类中使用访问 方法而非公有域


    Class Point {
        public double x;
        public double y;
    }

    如上面Point类的数据域是可以直接被访问的,这样的类没有提供封装。如果不改变API,就无法改变它的数据表示法(比如,使用一个比double更高精度的类来表示x和y),也无法强加任何约束条件(比如以后我们可能会希望x和y不会超过某个值)。

    Class Point {
        private double x;
        private 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; }
    }

    使用私有域和公有访问方法的公有类是比较合适的。在它所在的包的外部访问时,提供访问方法,以保留将来改变该类的内部表示法的灵活性。

    如果类是包级私有的,或者是私有的嵌套类,那么直接暴露它的数据域并没有错误。对于包级私有类,这些代码被限定在包含该类的包中,如果有必要,不改变包之外的任何代码而只改变内部数据表示法也是可以的;对于私有嵌套类,改变的作用范围限定在外围类中。

    让公有类暴露域不是好办法,但如果域是不可变的,这种做法的危害会较小:

    public final class Time {
        private static final int HOURS_PER_DAY = 24;
        private static final int MINUTES_PER_HOURS = 60;
        
        public final int hour;//hour是不可变域
        public final int minute;//minute是不可变域
    
        public Time(int hour, int minute) {//无法改变类的表示法,但是可以强加约束条件
            if(hour < 0 || hour > HOURS_PER_DAY)
                throw new IllegalArgumentException("Hour: " + hour);
            if(minute < 0 || minute >= MINUTES_PER_HOUR)
                throw new IllIllegalArgumentException("Minute: " + minute);
            this.hour = hour;
            this.minute = minte;
        }
    }

    总结:公有类永远都不应该暴露可变的域,让公有域暴露不可变域的危害较小(可以强加约束条件,不能改变域表示法),有时候需要用包级私有或者私有的嵌套类来暴露域,无论这个类是可变还是不可变的。

  • 相关阅读:
    FFT加速多项式乘法C语言版(基2FFT)
    springboot2中@ConfigurationProperties装载yml文件的时候调取出现值为null的解决办法
    LeetCode27-移除元素
    dom4j在解析xml文件的时候将" "解析成空格的解决办法
    LeetCode17- 电话号码的字母组合
    LeetCode19- 删除链表的倒数第N个节点
    LeetCode14- 最长公共前缀
    LeetCode20- 有效的括号
    LeetCode21- 合并两个有序链表
    MySQL单表百万数据记录分页性能优化
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5675083.html
Copyright © 2020-2023  润新知