網頁

2020/4/2

Effective Java 3e - Item 15: Minimize the accessibility of classes and members 筆記

Effective Java 3e - Item 15: Minimize the accessibility of classes and members 最小化類別及成員的存取 筆記。

設計類別組件時應盡可能限制存取,其只透過必要的公開API與其他組件溝通,並將內部實作細節隱藏。

限制組件存取的優點:

  • 容易維護
  • 減少耦合
  • 容易調校

容易維護

前提是必須搭配良好的命名,客戶端可由公開API名稱了解組件用途,提高可讀性。若實作細節沒有被隱藏,則客戶端必須從一堆公開API及原始碼中搞清楚組件用途。


減少耦合

組件間僅透過必要且少量的公開API溝通,清楚隔離,使耦合度降低,並進一步提高組件的可重用性,可測試性,可維護性。


容易調校

每個組件清楚地隔離且低耦合,將更容易找出影響校能的組件,也就是更容易找出效能瓶頸。


例用存取修飾子(Access Modifiers)降低類別及成員的存取性,換句話說就是正確地封裝(Encapsulation)類別及成員。

簡單法則:

make each class or member as inaccessible as possible.

讓類別及成員盡可能無法被存取。


頂級類別或介面(top-level class or interface)只有public及package-private兩種存取等級。

public

public class A { // public
    ....
}

package-private

class A { // package-private
    ....
}

若一個package-private頂級類別只被另一個類別使用,則考慮將該類別設計在使用類別的內部靜態類別(private static nested class)。

例如類別B是頂級類別並只被類別A使用,則可考慮把B類別改為A類別的內部靜態類別。

public class A {
    ....
    
    private static class B {
        ...
    }
}

類別的成員變數盡量不要設為public。

只有用作常數的原始型別(primitive type)或immutable類別成員變數才可設為public。

public class A {
    public static final int ROUND_TIMES = 5; // int為原始型別
    public static final String LANGUAGE = "Java"; // String是immutable類別
}

類別不應該存在public static final的陣列成員變數及直接存取此成員的公開方法,因為即使加了final修飾客戶端依舊能夠修改陣列的內容。不能被修改的只是陣列的參照。

public class A {
    public static final B[] VALUES = { ... }; // 陣列內容依舊能被外部修改
}

使用Java 9的模組系統(module system)限制模組中公開類別的public及protected成員是否能被其他模組存取。


參考:

沒有留言:

張貼留言