您的位置:首页 > 编程语言

【代码优化】考虑使用静态工厂方法代替构造器

2014-06-19 23:02 441 查看
静态工厂方法与设计模式中的工厂方法模式不同,和设计模式中的工厂方法模式不直接对应。

使用静态工厂方法比构造器的优势

第一、静态工厂方法是有名称的,而构造器是通过参数判断的。

每个静态工厂方法都有自己的名字,可以根据名称就可以判断它要做什么事情,而构造器是做不到的。

如:构造器BigInteger(int,int),返回BigInteger可以是素数,偶数等,而用名称BigInteger。probalePrime的静态工厂方法

就一目了然了,代码容易阅读。

第二、不必再每次调用时候都创建一个新的对象。

一个类预先构建一个实例,缓存起来,进行重复利用,避免不必要的重复对象。

实例的受控是的不可变类确保是一个Singleton或者是一个不可实例化的,使得不可变类可以保证不会存在两个相等的实例,

即a==b的时候才有a.equal(b)为TRUE。若果保证了这点就可以使用a==b代替a.equal(b),提升了性能。

第三、可以返回原类型的任何子类型的对象,这个都很容易理解,

第四、创建参数化类型实例时,代码更简洁。

在java8之前,遗憾的是,在调用参数化类型构造器时,即使类型参数很明显,也必须指明。如:

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

两次指明泛型类型,要是泛型变的更复杂,就多写了很多代码。

而使用静态工厂方法的实现就简洁很多了:

public static<K,V>  HashMap<K,V> newInstance() {

return newHashMap<K,V>();

}//这段代码可以复用

Map<K,V> map=HashMap.newInstance();

不过,什么事情都不是完美的,静态工厂方法也有它的缺点

1、类如果不含有公有的或者受保护的构造器,就不能被子类化。

也就是说,你不能把类的任何方便的实现类子类化,这是不可能的。

2、它和静态方法实际上没有任何区别。

因此,对于提供了静态工厂方法而不是构造器的类来说,要想查明如何实例化一个类,是很困难的。

总之,静态工厂方法和公有构造器各有优势,我们只需了解他们的特性,各取所需,通常情况下,不要第一反应就提供

公有的构造器,不妨考虑试试静态工厂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: