EffectiveJava(1) 构造器和静态工厂方法

构造器和静态工厂方法


**构造器是大家创建类时的构造方法,即使不显式声明,它也会在类内部隐式声明,使我们可以通过类名New一个实例.
静态方法是构造器的另一种表现形式**

主题要点:何时以及如何创建对象,何时以及如何避免创建对象,如何确保对象能够适时的销毁,以及如何管理对象销毁之前必须进行的清理动作
1.类通过静态工厂方法让客户端获取自身实例而不通过构造器
优势:-有名称(如果构造器本身没有确切的描述正被返回的对象,那具有适当名称的静态工厂1会更容易使用,产生的客户端代码也更容易阅读BigInteger.probablePrime>>BigInteger(int,int,Random))
-不必每次调用它的时候都创建一个新对象
-它们可以返回原返回类型的任何子类型的对象(灵活性)
-在创建参数化类型实例的时候,使代码变得更加简洁(必须指明类型参数)

 public static <K,V> HashMap<K,V> newInstance(){ return new HashMap<K,V>}
    Map<String,List<String>> map = HashMap.newInstance();
可以将这样的静态方法放在自己的参数化的类中

缺点:-类如果不含有公有的或者受保护的构造器,就不能被子类化
-它们与其他的静态方法实际上没有任何区别
静态工厂方法的使用场景
-当一个类需要多个带有相同签名的构造器时

2.服务提供者框架
多个服务提供者实现一个服务,系统为服务提供者的客户端提供多个实现,并把它们从多个实现中解耦出来
服务接口:提供者
提供者注册API:系统
服务访问API:客户端用来获取服务实例 >> 灵活的静态工厂
服务提供者接口:提供者负责创建其实现的实例

3.惯用名称
valueOf – 类型转换方法.该方法返回的实例与它的参数具有相同的值
of – valueOf的一种简洁写法
getInstance – 返回的实例是通过方法的参数来描述的.对于单例来说,该方法没有参数并返回唯一实例
newInstance – 确保返回的每个实例都与其他实例不同,其他功能同上
getType – type表示工厂方法中所返回的对象类型.在工厂方法处于不同类中使用
newType – 同上,类似newInstance

你可能感兴趣的:(EffectiveJava)