ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

《Effective Java》第16条:要在仅有类中使用访问方法而非公有域

2022-08-13 09:03:46  阅读:139  来源: 互联网

标签:Java hour Effective 非公有 double 公有 int public minute


《Effective Java》第16条:要在仅有类中使用访问方法而非公有域

一、 问题

有时候我们需要定义一些类用来集中实例域(Java对象中的数据)。经常我们会把这些数据域声明为public,可以被直接访问。这样公有类暴露了它的数据域,有以下两个缺点:

1、要想在将来改变其内部表示法是不可能的,因为公有类的客户端代码已经遍布各处了

二、分析

    class Point {
        public double x;
        public double 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 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) {
            throw new IllegalArgumentException("Hour: " + hour);
        }
        if (minute < 0 || minute >= MINUTES_PER_HOUR) {
            throw new IllegalArgumentException("Min: " + minute);
        }
        this.hour = hour;
        this.minute = minute;
    }
}

这个类确保了每个实例都表示一个有效时间。

三、总结

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

标签:Java,hour,Effective,非公有,double,公有,int,public,minute
来源: https://www.cnblogs.com/okokabcd/p/16581973.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有