《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; }}
这个类确保了每个实例都示意一个无效工夫。
三、总结
简而言之,私有类永远都不应该裸露可变的域。