这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战
暴露数据域让其他类直接访问带来的问题
每个类都应该提供封装,而不是将他们的数据域暴露出来让其他类直接访问参见此文章
java.awt.Point这个包就是如此
公有类不应该直接暴露数据域给外部访问,同样有这个问题的还有
Dimension
如此数据域被访问时我们没有办法来对它进行约束或者限制,有时我们可能对这个数据域要求进行脱密处理,比如电话号码的getter方法可能在里面添加了隐藏中间4位的逻辑,比如将18700000000变为187****0000,而如果我们可以直接访问数据域,那么这个数据的表示和我们设想的便不一致了,同时也带来了用户数据泄露的风险。
解决方案
应该使用私有的private来修饰数据域,同时暴露公有的getter和setter方法来对数据域进行访问和设置数值。
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; }
}
如果类可以在外部访问,就要提供访问方法给外部,保证我们将来能够对该数据域表达方式进行修改而不用满世界去找引用它的数据域的地方。有的时候我们会暴露final修饰的公有数据域出来,虽然不是一种好办法,但是相对来说危害就更小一些。
总结
一句话总结,公有类永远都不应该暴露可变的数据域。