1. 程式人生 > >EffectiveJava閱讀筆記(一)

EffectiveJava閱讀筆記(一)

考慮用靜態工廠方法代替構造器

一、概述

二、使用靜態工廠的優勢

獲取類物件的兩種方式:

  • 使用公有構造方法
  • 靜態工廠方法

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();

三、使用靜態工廠的缺點