網頁

2020/4/2

Effective Java 3e - Item 16: In public classes, use accessor methods, not public fields 筆記

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類別
}

參考:

沒有留言:

張貼留言