转载

EffectiveJava读书笔记-第2章-创建和销毁对象

静态工程方法四大优势

  1. 他们有名称: 实例化方法名称可以更形象的体现返回实例的意图
  2. 不必在每次条用他们的时候都创建一个新对象: 可以使类的实例变得受控, 比如 单例 , 无法实例化 , 等等其他一些定制实例化需求
  3. 他们可以返回原返回类型的任何字类型的对象: 适用于基于 接口的框架 , 可以隐藏具体的实现类
    1. java.util.EnumSet 的静态构建方法根据入参不同, 如<=64, 则返回 RegalarEumSet 实例, 否则返回 JumboEnumSet 实例
    2. 服务提供者框架: 重要组件: 1.服务接口:该服务能干嘛; 2.提供者注册API: 注册提供者用; 3.服务访问API:获取服务接口用的 4(可选).服务提供者: 实例化服务接口用的. 具体见下
  4. 在创建参数化类型实例的时候, 使代码变得简洁. 如 Map<String, List<String>> m = new HashMap<String, List<String>>(); , 使用静态工程方法可以写成 public static <K, V> HashMap<K, V> newInstance(){ return new HashMap<K, V>(); } , 客户端调用的时候可以写成 Map<String, List<String>> m = HashMap.newInstance();
// Service interface 服务接口
public interface Service{
}

// Service provider interface 服务提供者
public interface Provider{
    ServicenewService();
}

public class Services{
    private Services(){}
    private static final Map<String, Provider> providers = new ConcurrentHashMap<String, Provider>();
    public static final String DEFAULT_PROVIDER_NAME = "<def>";
    //Provider registration API 提供者注册API
    public static void registerDefaultProvider(Provider p){
        registerProvider(DEFAULT_PROVIDER_NAME, p);
    }
    public static void registerProvider(String name, Provider p){
        providers.put(name, p)
    }
    
    //Service access API 服务访问API
    public static Service newInstance(){
        return new Instance(DEFAULT_PROVIDER_NAME);
    }
    public static Service newInstance(String name){
        Provider p = providers.get(name);
        if (p=null) throw ....
        return p.newService();
    }
}

静态工程方法俩大缺点

  1. 类如果不含公有的或者受保护的构造器, 就不能被子类化: 比如无法子类化Collections Framework中的实现类, 但是建议用 复合(composition), 见16条
  2. 他们与其他的静态方法实际上没有任何区别: 无法在Javadoc等API文档中标出来, 但是可以通过 惯用名称 来显示的标出, 比如 getInstance, newInstance
原文  http://blog.loujiwei.cn/2018/05/02/读书笔记/Effective Java/2018-05-02-EffectiveJava读书笔记-第2章-创建和销毁对象/
正文到此结束
Loading...