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

在Java中有许多有用的“静态”类,之所以加上引号,是因为该类并未声明成static的(实际上对于外部类而言,只能接受public abstract 和 final这三个关键字)。但是对于程序员来说,该类是静态的,因为该类的内部显示定义了一个private的无参构造器(这样编译器不会自动添加默认的公有无参构造器),所以该类无法在外部进行实例化,事实上也没有必要使用new关键字进行实例化。因为这些类的内部并不存在可以改变状态的字段(即使有也是final的),在类的内部存在大量的被称作静态工厂(static factory)的方法。在JDK中有几个比较常见的例子,比如Collections,Arrays和Executors。这些类的内部提供了许多静态工厂方法(不同于设计模式中的工厂模式),用来返回一些类的实例。

使用静态工厂方法有几个优势(相对于构造器)

1. 该静态工厂方法有名称,通过赋予有意义的名称,使用该方法的程序员可以清晰的知道该方法的含义。而不同的构造器具有相同的名称,很难表示各自的不同含义,特别是当构造器的参数类型相同(可能顺序不同),这样程序员很容易出错。

2. 静态工厂方法不必每次调用都会创建一个新对象,比如你可以在静态工厂方法里限定创建该对象的个数,当超出规定的个数时,返回缓存里的对象。而每次调用构造器都会创建一个新的对象。

3. 静态工厂方法可以返回原返回类型的任何子类型的对象。使用接口来引用对象可以使程序有较大的灵活性。

4. 静态工厂方法在创建参数化类型的时候,可以使代码更加简洁。考虑实例化一个Map对象,该map的变量类型和实例化时都必须指明参数类型,很是繁琐:

Map<String,list<String>> m = new HashMap<String,List<String>>();

当使用静态工厂方法时,

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

return new HashMap<K,V>();

}

Map<String,List<String>> m = HashMap.newInstance();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值