静态工厂的优势见源码|静态工厂返回声明的返回类型的子类型的实例。
本文记录静态工厂方法的一些惯用名称,开发中应遵循这些好的习惯。
valueOf
该方法返回的实例与它的参数具有相同的“值”。
如Integer.valueOf()方法:
|
|
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()破坏了编译时的检查:
- newInstance方法总是企图调用类的无参构造器。这个构造器甚至可能根本不存在,或者用户无访问权限,但编译期间你不会收到任何错误
- newInstance方法还会传播由无参构造器抛出的任何异常,即使newInstance缺乏相应的throws子句
getType
返回的类型是根据方法的参数来描述的,但是不能够说与参数具有相同的值。就像是针对类型的getInstance,如Character.getType()方法。
newType
待定,我没理解,也没找到实例。
参考:
- 《Effective Java》中文版第2版