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;
    }

}

优势三:可以返回原类型的任何子类型对象

如前面所说的Executors工具类。其中的静态工厂方法,返回的对象都是ThreadPoolExecutor对象,ThreadPoolExecutor是Executors的子类。

优势四:在创建参数化类型实例的时候,它们使代码变得简洁

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

三、使用静态工厂的缺点

转载于:https://www.cnblogs.com/fonxian/p/10261842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值