文章目录
  1. 1. 使用静态工厂方法代替构造器

使用静态工厂方法代替构造器

静态工厂方法只是一个返回类的实例的静态方法。如下简单示例:

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

静态工厂方法的优势

  1. 静态工厂方法的名称更容易理解,更容易阅读。
    比如,一个类有多个重载的构造器,使用或阅读的时候就会混淆,搞不清楚,而使用静态工厂方法则没有这种限制,可以根据不同的功能构造不用的对象。’BigInteger.probablePrime’就是一个用于产生的静态工厂方法。
  2. 不必在每次调用它们的时候都创建一个新的对象。
    静态工厂方法可以为重复的调用返回相同的对象,这样有助于类严格控制在某个时刻哪些实例应该存在,这种类被称作实例受控的类。实例受控可以确保类是一个单例或者是不能实例化,这样可以使用==操作符代替equals方法,提升性能。
  3. 可以返回原返回类型的任何子类型的对象。
    这样在选择返回对象的类时就具有更大的灵活性。java的集合框架就采用了这种实现,返回的子类都是非公有的,外部访问不到,对调用者来说并不知道是哪个子类的对象,隐藏了实现细节,减少了API的数量,提高了易用性。例如,EnumSet中,创建一个空的enum set

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
    Enum[] universe = getUniverse(elementType);
    if (universe == null)
    throw new ClassCastException(elementType + " not an enum");

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

    如果,枚举类型的元素个数不超过64个则返回RegalarEnumSet实例,否则返回JumboEnumSet实例。而RegalarEnumSet类的定义:
    不是public的类

    1
    class RegularEnumSet<E extends Enum<E>> extends EnumSet<E>
    1. 在创建参数化类型实例的时候,静态工厂方法使代码变得更加简洁。
      构造器:
      1
      Map<String,List<String>> m = new HashMap<String,List<String>>();

    静态工厂:

    1
    2
    3
    4
     public static <k,v> HashMap<k,v> newInstance(){
    return new HashMap<k,v>();
    }
    Map<S

静态工厂方法缺点

  1. 一个类如果没有public或protected的构造器,就不能被继承。
  2. 静态工厂方法只是普通的静态方法,并没有特别标识,所以对于使用者来说,并不能确定哪个静态方法才是用来实例化的。
    这方面可以通过javadoc工具识别特定的注释来生成详细的API文档。目前,还没有实现。那么记一些常用的静态工厂方法名可能会有用:
  • valueOf:实际上是类型转换的方法
  • of: valueOf简略版
  • getInstance
  • newInstance:每次返回一个新建的实例
  • get_Type_:与getInstance一样,_Type_表示返回实例的类型。
  • new_Type_:对应netInstance,_Type_表示返回实例的类型。
文章目录
  1. 1. 使用静态工厂方法代替构造器