EffectiveJava閱讀筆記(一)
阿新 • • 發佈:2019-01-13
考慮用靜態工廠方法代替構造器
一、概述
二、使用靜態工廠的優勢
獲取類物件的兩種方式:
- 使用公有構造方法
- 靜態工廠方法
1、介紹
- 有名稱
- 不必每次呼叫時建立一個新物件
- 可以返回原型別的任何子型別物件
- 在建立引數化型別例項的時候,它們使程式碼變得簡潔
2、優勢詳解
優勢一:有名稱
一個常見的例子,併發庫中的Executors工具類。Executor的靜態工廠方法有不同的名字,更能清晰地表達要返回哪種型別的執行緒池物件。
public class Executors { public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(...); } public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(...); } public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(...); } }
Executors的繼承關係如下
public interface ExecutorService extends Executor {...}
public abstract class AbstractExecutorService implements ExecutorService {...}
public class ThreadPoolExecutor extends AbstractExecutorService {...}
優勢二:不必每次呼叫時建立一個新物件
DynamicPropertyFactory為Eureka中用於讀取配置檔案的類。它就使用了靜態工廠來返回單例物件
public class DynamicPropertyFactory { private static DynamicPropertyFactory instance = new DynamicPropertyFactory(); private DynamicPropertyFactory() { } public static DynamicPropertyFactory getInstance() { if (config == null) { Class var0 = ConfigurationManager.class; synchronized(ConfigurationManager.class) { if (config == null) { AbstractConfiguration configFromManager = ConfigurationManager.getConfigInstance(); if (configFromManager != null) { initWithConfigurationSource(configFromManager); initializedWithDefaultConfig = !ConfigurationManager.isConfigurationInstalled(); logger.info("DynamicPropertyFactory is initialized with configuration sources: " + configFromManager); } } } } return instance; } }
優勢三:可以返回原型別的任何子型別物件
優勢四:在建立引數化型別例項的時候,它們使程式碼變得簡潔
Map<String, List<String>> map = new HashMap<String, List<String>>();
public static HashMap<K, V> newInstance() {
return new HashMap<K, V>();
}
Map<String, List<String>> map = HashMap.newInstance();