静态工厂方法的优缺点分析

静态工厂方法的优缺点分析

本文参考Effective Java的观点,简单罗列下静态工厂方法的在创建对象时的优缺点。

先看一个Boolean(基本类型boolean的包装类)的简单示例

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

静态工厂方法的优点:

  • 静态方法有名称

具有适当名称的静态工厂方法更易于阅读,而构造器的参数本身没有确切描述被返回的对象。如:BigInteger(int, int, Random)返回的BigInteger可能为素数,如果使用BigInteger.probablePrime的静态方法来表示,就更为清楚。

  • 不必在每次调用类时都创建一个新对象

对于不可变类可以使用预先构建好的实例,或则将构建好的实例缓存起来,进行重新复用。

  • 可以返回原返回类型的任何子类型的对象

我们在选择返回对象的类时,使用静态工厂方法就更有灵活性。这种灵活性的一种应用是API可以返回对象,同时又不会使对象的类变成公有的。这种方式隐藏实现类会使API变得非常简洁。
在Java的集合框架的接口实现中,几乎所有这些实现都通过静态工厂方法在一个不可实例化的类中导出,所有返回对象的类都是非公有的。
公有的静态工厂方法所返回的对象的类不仅可以是非公有的,还可以随着参数值的不同而每次调用也发生变化。只要是已声明的返回类型的子类型,都是允许的。

  • 在创建参数化类型实例时,代码更加简洁

调用参数化类的构造器时,即使类型参数很明显,也必须指明,这通常要求你接连两次提供类型参数。例如创建HashMap的实例。
随着类型参数变得越来越长,冗长的说明也很快变得痛苦起来,但是使用静态工厂方法,编译器就可以替你找到类型参数,这被称作类型推导.
Google的Guava集合框架中提供了类似的Lists.newArrayList的方法。可以试着比较下面两个代码:

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

下面的写法显然更简便。

静态工厂方法的缺点

一个类如果不含公有的或者受保护的构造器,就不能被子类化。其次静态工厂方法与其他静态方法实际上没有任何区别。Javadoc工具不会区别出静态工厂方法,所有静态工厂方法命名应当遵守标准的命名习惯来弥补这一劣势。惯用名称有:valeuOf,of,getInstance,getType,newType等。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值