首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java private 關鍵字完全指南:封裝核心、建構子控制與多執行緒安全

     編輯:Java 相關知識

private 是 Java 封裝的**最嚴格層級**:「唯有定義該成員的類別本身,才能存取」。它不僅隔離外部類別,連同套件內的其他類別也擋在門外。本文將詳細說明 private 的精確語意、控制物件建立的經典模式、防止繼承的副作用,以及在多執行緒環境下的關鍵價值。

private 精確語意

  • 可見範圍:僅限**宣告該成員的類別內部**(含巢狀類別)
  • 同套件其他類別:**不可見**(這點與 package-private 截然不同)
  • 子類別(即使同套件):**不可見**

這使 private 成為「類別內部實作細節」的鐵壁。

經典應用:私有建構子控制物件建立

將**所有**建構子標記 private,外部無法直接 new,必須透過類別提供的靜態工廠方法:

class Sundae {
    private Sundae() {}  // 唯一建構子為 private

    static Sundae makeASundae() {  // 受控建立入口
        // 可在此加入:參數驗證、實例池化、建立計數、日誌記錄等
        return new Sundae();
    }
}

public class IceCream {
    public static void main(String[] args) {
        // Sundae x = new Sundae();  // 編譯錯誤:建構子私有
        Sundae x = Sundae.makeASundae();  // 唯一合法途徑
    }
}

此模式帶來的控制力:

  1. 單例:靜態欄位持有唯一實例,access() 回傳
  2. 物件池:限制同時存在實例數量
  3. 參數驗證:建立前檢查,失敗拋異常而非產生無效物件
  4. 延遲建立:首次呼叫才真正建立(Lazy Initialization)
  5. 回傳子類別實例:工廠方法可回傳 Sundae 子類別,呼叫端無感

副作用:防止繼承

若類別**只有** private 建構子(無 public/protected/package-private 建構子),則**無法被繼承**:

  • 子類別建構子隱式呼叫 super(),需存取父類別建構子
  • private 建構子不可見 → 子類別無法編譯

這是「最終類別」的另一種實現方式(另一種是 final class)。

私有方法:內部實作的安全區

將輔助方法標記 private 的好處:

  • 確保**不會被同套件其他類別誤呼叫**
  • 重構時可隨意修改簽名、刪除、調整邏輯,**零風險影響外部**
  • 文件瀏覽器自動隱藏,保持介面乾淨

多執行緒環境下的關鍵價值

書中提到 private 在多執行緒(第 14 章)有「非常重要的用途」,核心在於:

  • 封裝可變狀態:將非執行緒安全的欄位標記 private,只透過 synchronized 方法存取
  • 防止資料競爭:外部無法直接讀寫欄位,繞過同步機制
  • 封裝同步策略:類別內部決定用 synchronized、Lock、Atomic 還是無鎖演算法,外部不需知情

這是 private 從「語法規則」昇華為「併發設計基石」的關鍵。

別名問題提醒

private 修飾的是**參考變數**,而非物件本身:

class A {
    private String secret = "secret";
    public String getSecret() { return secret; }  // 洩露參考!
}

呼叫端取得 secret 的參考後可修改其內容(若為可變物件)。解決:回傳**防禦性副本**或不可變物件。詳細探討見第 12 章「別名」。

最佳實務摘要

場景建議
預設欄位可見性private(資料隱藏)
輔助方法private(實作細節)
需給子類別的擴充點protected 方法(而非欄位)
套件內協作package-private(預設)
對外契約public 介面(最小化)
控制建立/單例/池化私有建構子 + 靜態工廠

private 是封裝的基石,也是併發安全的第一道防線。養成「預設 private,按需放寬」的習慣,能讓你的類別同時擁有清晰介面、自由重構空間與執行緒安全保障。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved