Effective Java 3e - Item 16: In public classes, use accessor methods, not public fields 公開類別使用存取方法而非公開成員變數 筆記。
如果類別是公開(public)的,也就是此類別能被package外的其他類別存取,則此公開類別(public class)的成員不應直接被公開存取,而應改用存取方法getter及setter。
例如下面Point
為公開類別,其成員不應該被直接公開存取。
Point
public class Point {
public double x; // 存取為public,能被外部直接存取
public double y;
}
public staic void Main(String[] args) {
Point p = new Point();
p.x = 1.0;
p.y = 2.0;
int x1 = p.x;
int y1 = p.y;
}
公開類別成員應限制在類別中才能取用,外部若要存取應透過getter setter方法。
Point
public class Point {
private double x; // 存取限制為private不公開,外部必須透過getter setter方法存取
private double y;
public double getX() {
return this.x;
}
public void setX(double x) {
this.x = x;
}
public double getY() {
return this.y;
}
public void setY(double y) {
this.y = y;
}
}
public staic void Main(String[] args) {
Point p = new Point();
p.setX(1.0);
p.setY(2.0);
int x1 = p.getX();
int y1 = p.getY();
}
公開類別的成員變數若設為公開,則無法帶來封裝(Encapsulation)的好處,漏出不必要的實作細節使可讀性降低。而公開的成員變數無法保持類別中值的不變性,因為外部能直接對其修改。另外由於外部能直接讀取公開成員無須透過存取方法,導致失去對該成員變數對外部呈現的控制權。
至於package-private class或private nested class的成員變數則不一定要嚴格限至為不公開,因為類別存取本身限制了其成員變數的存取範圍。package-private class的公開成員僅能被同package的類別存取;private nested class的公開成員只能被所屬的outer class存取。
總之類別的屬性應盡可能設為private
,沒有必要不應設為public
。
只有作為常數使用的原始型別或不可變物件的成員才能被設為public
,原因是常數變數值固定不變,只能讀取且無法被修改。
public class Foo {
public static final int TIMES = 10; // int為原始型別
public static final String NAME = "Foo"; // String是immutable類別
}
參考:
沒有留言:
張貼留言