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成員是否能被其他模組存取。
參考:
沒有留言:
張貼留言