【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、
生活随笔
收集整理的這篇文章主要介紹了
【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一. 用靜態工廠方法代替構造器
- 優勢:
- 劣勢:
- 實例代碼:
- 二. 遇到多個構造器參數時要考慮使用構建器
- ① 重疊構建器
- ② JavaBeans模式
- ③ Builder模式
- 三. 用私有構造器或枚舉類型強化Singleton屬性
- 方法一:公有靜態成員是個final域
- 方法二:公有的成員是個靜態工廠
- 方法三:一個包含單個元素的枚舉類型
- 四. 通過私有構造器強化不可實例化的能力
一. 用靜態工廠方法代替構造器
優勢:
- 有名稱,可以確切地描述正被返回的對象。
- 不必在每次調用的時候都創建新對象。
- 可以返回原返回類型的任何子類型對象。
- 返回的對象的類可以隨著每次調用而產生變化。
- 返回的對象所屬的類,在編寫靜態工廠方法時可以不存在。
劣勢:
- 類如果不含公有的或者受保護的構造器,就不能被子類化。
- 程序員很難發現他們,但是可以通過遵守標準的命名習慣來彌補。
實例代碼:
這是第二版的代碼,在第三版里已經刪去了。不過可以用來便于理解。
// 英文部分可以不看,或者作為參考。/** 用于描述Provider所提供的服務 */ public interface Service { ... // Service-specific methods go here } /** 用于描述Provider,每個Provider都要有自己的newService */ public interface Provider { Service newService(); } // Noninstantiable class for service registration and access public class Services { // 私有化構造方法,不會把工廠實例化,直接用類名。 private Services() { } // Prevents instantiation (Item 4)// 使用Map來存儲各provider及其name的映射。 // 使用final:只是providers一直指向當前HashMap,對HashMap里的內容變化沒有影響。 // Maps service names to services private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>(); public static final String DEFAULT_PROVIDER_NAME = "<def>"; ITEM 1: CONSIDER STATIC FACTORY METHODS INSTEAD OF CONSTRUCTORS 9 // Provider registration API public static void registerDefaultProvider(Provider p) { registerProvider(DEFAULT_PROVIDER_NAME, p); } // 注冊Provider到工廠Services里。 public static void registerProvider(String name, Provider p){ providers.put(name, p); } // Service access API public static Service newInstance() { return newInstance(DEFAULT_PROVIDER_NAME); } // 根據name從工廠中取出對應Provider提供的服務。 public static Service newInstance(String name) { Provider p = providers.get(name); if (p == null) throw new IllegalArgumentException( "No provider registered with name: " + name); return p.newService(); } }二. 遇到多個構造器參數時要考慮使用構建器
① 重疊構建器
參考下面的代碼,活用this,但是參數多的時候難寫,并且用起來容易出錯。
public class NutritionFacts { private final int servingSize; // (mL) required private final int servings; // (per container) required private final int calories; // optional private final int fat; // (g) optional private final int sodium; // (mg) optional private final int carbohydrate; // (g) optional public NutritionFacts(int servingSize, int servings) { this(servingSize, servings, 0); } public NutritionFacts(int servingSize, int servings, int calories) { this(servingSize, servings, calories, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat) { this(servingSize, servings, calories, fat, 0); } public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium) { this(servingSize, servings, calories, fat, sodium, 0); } 12 CHAPTER 2 CREATING AND DESTROYING OBJECTS public NutritionFacts(int servingSize, int servings, int calories, int fat, int sodium, int carbohydrate) { this.servingSize = servingSize; this.servings = servings; this.calories = calories; this.fat = fat; this.sodium = sodium; this.carbohydrate = carbohydrate; } }② JavaBeans模式
- 構造函數就是:ClassName(){}
- 把賦值交給Setters來實現
- 彌補了重疊構造器的不足,容易創建實例,并且易讀
- 缺點1:構造過程中JavaBean可能處于不一致的狀態(畢竟要多次賦值)
- 缺點2:使得把類做成不可變的可能性不存在(不能final,畢竟之后還要set的嘛)
③ Builder模式
- 既保證了像重疊構造器的安全性,也保證像JavaBeans的可讀性
- 描述:用類的Builder,來構建類的對象。
- 還適用于類層次結構(這里會麻煩點,涉及到抽象類、范式等等)
三. 用私有構造器或枚舉類型強化Singleton屬性
- 單例模式
方法一:公有靜態成員是個final域
// Singleton with public final field public class Elvis { // 公有 靜態 final public static final Elvis INSTANCE = new Elvis(); // 構造函數私有化 private Elvis() { ... } public void leaveTheBuilding() { ... } }方法二:公有的成員是個靜態工廠
相對于方法一,畢竟類的成員還是要用方法來訪問比較好。
// Singleton with public final field public class Elvis { // 把public 變成 private private static final Elvis INSTANCE = new Elvis(); // 構造函數私有化 private Elvis() { ... } // 公有靜態方法,返回唯一的實例。 public static Elvis getInstance(){return INSTANCE} public void leaveTheBuilding() { ... } }方法三:一個包含單個元素的枚舉類型
- Java的enum和C++的差別很大。
- 這樣子寫會比較簡便。
四. 通過私有構造器強化不可實例化的能力
- 這塊感覺沒啥好講的,就是給構造函數加個private。
- 好壞處之類的可以參考書里的內容。
總結
以上是生活随笔為你收集整理的【Effective Java】第二章:静态工厂、构建器、强化Singleton属性、私有构造器、的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 西北工业大学计算机毕业论文,西北工业大学
- 下一篇: 【LeetCode笔记】206. 反转链