《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;
}
}
這個類確保了每個實體都表示一個有效時間,
三、總結
簡而言之,公有類永遠都不應該暴露可變的域,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501774.html
標籤:Java
