Effective Java笔记

第二章 建立和销毁对象java

第1条 考虑用静态工厂方法代替构造器缓存

二者建立对象的形式,例如:
构造器是new Boolean();
静态工厂方法是dom

public static Boolean valueOf(boolean b) {
    return (b ? TRUE : FALSE);
}

在Boolean类中, 常量TRUE和 FALSE又以下:性能

public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);

静态工厂方法的4个优点:
1.有名称,即方法名。构造器的参数没有确切地描述其返回的对象,适当名称的静态工厂方法更容易使用,也易于阅读。例如:
BigInteger(int, int, Random)返回的值可能为素数;用名为 BigInteger.probablePrime(int, Random)来表示,更清楚。code

2.没必要在每次调用它们的时候都建立一个新对象。例如: Boolean.valueOf(boolean)。
这个方法中的 TRUE和 FALSE是预先构建好的实例,并被缓存,能够重复利用。
若是程序常常建立相同的对象,而且代价很高,则这项技术能够提高性能。对象

3.能够返回原返回类型的任何子类型的对象。这样提供了的灵活性。例如:
API能够返回对象,同时又不会使对象的类变成公有的。这样,API会变得简洁。
java.util.EnumSet类中的noneOf方法。代码片断:element

if (universe.length <= 64)
    return new RegularEnumSet<>(elementType, universe);
else
    return new JumboEnumSet<>(elementType, universe);

其中 RegularEnumSet和 JumboEnumSet都是 EnumSet的子类。文档

4.在建立参数化类型实例的时候,使代码变得简洁。例如:List

Map<String, List<String>> map = new HashMap<String, List<String>>();

若是 HashMap提供这样的的方法:map

pubic static <K, V> HashMap<K, V> newInstance() {
    return new HashMap<K, V>();
}

那么,上面的代码就能够这样:

Map<String, List<String>> map =  HashMap.newInstance();

静态工厂方法的2个缺点:1.类若是不含公有的或者受保护的构造器,就不能被子类化。2.与其余的静态方法实际上没有任何区别。在API文档中,没有像构造器那样明确标识出来,所以,对于提供了静态工厂方法而不是构造器的类来讲,要查明如何实例化一个类,有点困难。

相关文章
相关标签/搜索