第14条:在公有类中使用访问 方法而非公有域
2016-07-15 23:59
169 查看
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; } }
总结:公有类永远都不应该暴露可变的域,让公有域暴露不可变域的危害较小(可以强加约束条件,不能改变域表示法),有时候需要用包级私有或者私有的嵌套类来暴露域,无论这个类是可变还是不可变的。
相关文章推荐
- NOIP2012D2T1 同余方程
- NOIP2012D2T1 同余方程
- Thinking in C++: 第1章 多态性
- 洛谷 P1311 [NOIP2011 D1T1] 选择客栈
- 比之前那个版本更简单的C语言实现的比较大小
- python内置函数 1
- 富文本 编辑器
- GetModuleFileName函数
- 3C(Computer、Communication、Consumer Electronic)
- NOIP 2013 T2 火柴排队 ---->求逆序对
- NOIP 2013 T2 火柴排队 ---->求逆序对
- time模块
- android知识点整理
- LeetCode进阶之路(3Sum Closest)
- 常用三角函数公式
- Java内存模型与Java线程的实现原理
- 页面上下内容折叠
- golang项目结构日记
- 与web前端朋友闲聊的发现-代码相通性
- NOIP2013T1 转圈游戏 快速幂