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

Effective Java 項目 1:考慮以靜態工廠方法取代建構子

     編輯:Java 相關知識

兩種創建物件的途徑

  1. 公有建構子
  2. 靜態工廠方法(static factory method)

靜態工廠方法非「工廠方法模式」,僅指回傳類別實例的靜態方法。

靜態工廠方法的四大優勢

1. 名稱有意義,提升可讀性

建構子名稱固定為類別名,而靜態工廠方法可自訂名稱:

PrimeNumber p1 = new PrimeNumber(int random);       // 意圖不明
PrimeNumber p2 = PrimeNumber.newInstance();         // 語意清晰

2. 避免重複創建物件,提升效能

建構子每次必創建新實例;靜態工廠方法可回傳快取或預先創建的實例,Singleton 模式即基於此原理。

3. 可回傳子型別,提供彈性

工廠方法可根據參數決定回傳哪個實作類別:

class Father {
    private Father() {}
    public static Father newInstance(String type) {
        if ("ChildA".equals(type)) return new ChildA();
        else return new ChildB();
    }
    private static class ChildA extends Father {}
    private static class ChildB extends Father {}
}

4. 簡化參數化類別實例化語法

Java 7 前需重複泛型參數,工廠方法可利用型別推導:

Map> map = new HashMap>(); // 冗長
public static  HashMap newInstance() { return new HashMap(); }
// 使用:Map> map = HashMap.newInstance();

兩大缺點

  • 無法子類化:若建構子為私有,子類別無法調用 super()。
  • 難以從 API 文件中識別:靜態工廠方法與普通靜態方法無異,慣用命名慣例(如 valueOf、getInstance、of)以利辨識。

選擇建議

靜態工廠方法與公有建構子各有優劣,但前者通常更合適。切勿本能地提供公有建構子,應先評估靜態工廠方法是否更佳。

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