静态工厂方法的一些惯用名称?举例?

600 阅读2分钟

静态工厂的优势见源码|静态工厂返回声明的返回类型的子类型的实例

本文记录静态工厂方法的一些惯用名称,开发中应遵循这些好的习惯。

valueOf

该方法返回的实例与它的参数具有相同的“值”。

如Integer.valueOf()方法:

    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
…
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

Integer类默认缓存low~high之间的常量(low=-127;high默认127,可配置,最高high-low+1不超过Integer.MAX_VALUE,即数组的最大长度),通过静态工厂方法valueOf(i),low<=i<=high时,我们每次获得的都是缓存好的常量。这是静态工厂方法带来的好处。

of

valueOf的一种简洁写法。

如LocalDate.of()方法。

getInstance

返回的实例是根据方法的参数来描述的,但是不能够说与参数具有相同的值。一般用来表示获取相同的实例,如单例模式,或根根参数获取不同的单例等。

newInstance

类似于getInstance。不同的是,一般用来表示获取新的实例,如Class#newInstance()方法等。

与Builder模式相比,Class#newInstance()的缺点

Class#newInstance()破坏了编译时的检查:

  1. newInstance方法总是企图调用类的无参构造器。这个构造器甚至可能根本不存在,或者用户无访问权限,但编译期间你不会收到任何错误
  2. newInstance方法还会传播由无参构造器抛出的任何异常,即使newInstance缺乏相应的throws子句

getType

返回的类型是根据方法的参数来描述的,但是不能够说与参数具有相同的值。就像是针对类型的getInstance,如Character.getType()方法。

newType

待定,我没理解,也没找到实例。


参考:

  • 《Effective Java》中文版第2版

本文链接:静态工厂方法的一些惯用名称?举例?
作者:猴子007
出处:monkeysayhi.github.io
本文基于 知识共享署名-相同方式共享 4.0 国际许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名及链接。