1. 程式人生 > >《 Java 程式設計思想》CH06 訪問許可權控制

《 Java 程式設計思想》CH06 訪問許可權控制

  • 訪問控制(或隱藏具體實現)與“最初的實現並不恰當”有關。
  • 重構即重寫程式碼,以使得它更可讀,更容易理解,並因此而更具維護性。
  • 在面向物件設計中需要考慮一個基本問題:“如何把變動的事物與保持不變的事物區分開來”
  • 應該儘可能將一切方法都定為private,而僅向客戶端程式設計師公開你願意讓他們使用的方法。

包:庫單元

  • 包內包含有一組類,它們在單一的名字空間之下被組織在一起
  • 為了解決潛在的名字衝突問題,Java使用 package 對名稱空間進行完全控制併為每一個類建立唯一的識別符號組合。
  • 每一個編譯單元(.java 檔案)只能有一個 public 類。
  • 當編譯一個 Java 檔案時,.java 檔案中的每一個類都會生成一個與其類名相同的 .class 檔案
  • Java 可執行程式是一組可以打包並壓縮為一個 Java 文件檔案(JAR)的 .class 檔案,Java直譯器負責這些檔案的查詢、裝載和解釋。
  • 類庫實際上一組類檔案。其中每個檔案都有一個 public 類,以及任意數量的非 public 類。因此每個檔案都有一個構件,如果希望他們都屬於同一個群組,則可以使用關鍵詞 package。
  • package 語句必須是檔案中除了註釋外的第一行程式碼。如packgae access;表示當前檔案是 access 類庫的一部分,識別符號為access.ClassName;
  • package 名稱的第一部分應該是域名的逆序。
  • package 名稱會被分解為一個目錄路徑,這個包的所有檔案都應該放在該資料夾中,例如包名為fun.wuxiaobai24.access
    ,則被解釋成$CLASSPATH/fun/wuxiaobai24/access,其中$CLASSPATH為環境變數,CLASSPATH 可以指定多個目錄。
  • 在使用JAR檔案時,需要在 CLASSPATH 中指明JAR檔案的真實路徑,如CLASSPATH = .;~/jar/access.jar
  • 如果將兩個包含相同名稱的類庫用*形式匯入時,在使用重名的類時,需要指明是那個包中的,如fun.wuxiaobai24.access.ClassName c = new fun.wuxiaobai24.access.ClassName()
  • 使用import static語句進行靜態匯入,將某個包中的所有靜態方法匯入,這樣可以直接用靜態方法名進行方法呼叫,而不用在前面加類名,如呼叫某個類中的 main() 方法時,靜態匯入可以直接main();
    ,而普通的匯入而需要ClassName.main();
  • Java 中 沒有 C 中的條件編譯,但是可以用 import 來間接實現某些功能。

Java 訪問許可權修飾詞

  • 包訪問許可權允許將包內所有相關的類組合在一起,以使得它們彼此之間可以相互訪問作用。
  • 繼承而來的類可以訪問publicprotected,只有當兩個類在同一個包中時才能訪問包訪問許可權的成員。
  • 對於OOP而言,提供訪問器和變異器(getter/setter),以讀取或改變數值是最優雅的方法,而是 JavaBean 的基本原理。
  • 如果沒有給檔案指定包,Java 將這些檔案視為該目錄的預設包中,於是給該目錄中所有其他的檔案提供包訪問許可權。
  • 不能因為在類中某個物件的引用是 private,就認為其他物件就不能擁有該物件。
  • protected 成員除了繼承的子類可以訪問外,它也有包訪問許可權,即同一個包下的類可以訪問它。
  • private 可以用來實現單例子模式:
class Soup {
    private Soup() {}
    private static Soup soup = new Soup();
    public static Soup access() {
        return soup;
    }
}

介面和實現

訪問許可權的控制常被稱為具體實現的隱藏。把資料和方法包裝進類中,以及具體的實現的隱藏,常共同被稱為封裝。其結果是一個同時帶有特徵和行為的資料型別。

訪問許可權控制將許可權的邊界劃在資料型別的內部的原因:

  • 不用擔心客戶端程式設計師偶然地將內部機制當作他們可以使用的介面的一部分。
  • 介面和具體實現的分離

類的訪問許可權

為了控制類的訪問許可權,修飾詞必須出現在關鍵詞 class 之前,如public class ClassName。同時有一些額外的限制:

  • 每個編譯單元(檔案)都只能有一個 public 類。每個編譯單元都有單一的公共介面,同 public 類實現
  • public 類的名稱必須與檔名相同,包括大小寫。
  • 編譯單元(檔案)中可以完全不帶 public 類,此時可以隨意對檔案命名。

類的訪問許可權只有 public 和包訪問許可權。如果希望其他任何人對該類有訪問許可權,可以將所有的構造器都指定為 private,但是該類中 static 成員仍然可以建立和訪問。
首發與Code &