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

Java 靜態工廠方法替代建構子:用法、優缺點與命名慣例

     編輯:Java 程式設計入門

什麼是靜態工廠方法?

類別提供一個 public static 方法回傳該類別(或子類別)實例,而非直接使用 public 建構子。經典範例:Boolean.valueOf(boolean)、Collections.singletonList()。

基本形式

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE; // 回傳預先建立的常量實例
}

四大優點

  1. 有意義的名稱:BigInteger.probablePrime() 比 new BigInteger(...) 更能表達意圖。
  2. 不必每次建立新物件:可回傳快取實例(如 Boolean、Integer.valueOf(-128~127))、單例、享元模式。
  3. 可回傳子類型實例:API 公開介面,實際回傳具體實作類別(如 EnumSet.noneOf() 回傳 RegularEnumSet 或 JumboEnumSet)。
  4. 簡化泛型實例化:Java 7 前 new HashMap<String,List<String>>>() 繁瑣,工廠方法可推導型參:HashMap.newInstance()(或 Guava Maps.newHashMap())。

兩大缺點

  1. 無法子類化:若類別無 public/protected 建構子,子類別無法呼叫 super(),導致無法繼承。(解法:改用非 final 類別 + protected 建構子 + 文檔規範)
  2. 不易被開發者發現:IDE 自動完成、文檔標準建構子摘要中不會列出靜態工廠方法,需依賴命名慣例與良好文檔。

常見命名慣例

名稱用途範例
valueOf型別轉換、回傳等值實例String.valueOf(int), BigInteger.valueOf(long)
of簡潔工廠,常用於集合、OptionalList.of(), Optional.of()
getInstance單例模式Calendar.getInstance()
newInstance每次建立新實例Array.newInstance()
getType回傳不同類別的工廠(參數化型別)FileStore.getFileStore()
newType建立新實例,強調「新」BufferedReader.newBufferedReader()

實際應用範例:參數驗證與快取

public final class ConnectionConfig {
    private final String url;
    private final int timeout;
    private static final Map<String, ConnectionConfig> CACHE = new ConcurrentHashMap<>();

    private ConnectionConfig(String url, int timeout) {
        this.url = url; this.timeout = timeout;
    }

    // 靜態工廠:驗證參數、快取重用
    public static ConnectionConfig of(String url, int timeout) {
        if (url == null || url.isBlank()) throw new IllegalArgumentException("URL 不能為空");
        if (timeout <= 0) throw new IllegalArgumentException("逾時需為正數");
        String key = url + "#" + timeout;
        return CACHE.computeIfAbsent(key, k -> new ConnectionConfig(url, timeout));
    }

    // 公開唯讀屬性
    public String getUrl() { return url; }
    public int getTimeout() { return timeout; }
}

何時選擇建構子?

  • 簡單資料容器(DTO/POJO),無需驗證、快取、多型實例化。
  • 框架要求(如 JPA、序列化庫)需無參建構子。
  • 團隊習慣統一使用建構子,避免認知負擔。

總結

靜態工廠方法提供更豐富的語意、實例控制與彈性,是 API 設計的利器。只要注意「不可繼承」與「可發現性」兩大缺點,配合命名慣例與完整文檔,即可在恰當場合發揮最大效用。

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