java构造对象
文章目录
使用静态工厂方法代替构造器
静态工厂方法只是一个返回类的实例的静态方法。如下简单示例:1
2
3public static Boolean valueOf(boolean b){
return b?Boolean.TRUE:Boolean.FALSE;
}
静态工厂方法的优势
- 静态工厂方法的名称更容易理解,更容易阅读。
比如,一个类有多个重载的构造器,使用或阅读的时候就会混淆,搞不清楚,而使用静态工厂方法则没有这种限制,可以根据不同的功能构造不用的对象。’BigInteger.probablePrime’就是一个用于产生的静态工厂方法。 - 不必在每次调用它们的时候都创建一个新的对象。
静态工厂方法可以为重复的调用返回相同的对象,这样有助于类严格控制在某个时刻哪些实例应该存在,这种类被称作实例受控的类。实例受控可以确保类是一个单例或者是不能实例化,这样可以使用==操作符代替equals方法,提升性能。 可以返回原返回类型的任何子类型的对象。
这样在选择返回对象的类时就具有更大的灵活性。java的集合框架就采用了这种实现,返回的子类都是非公有的,外部访问不到,对调用者来说并不知道是哪个子类的对象,隐藏了实现细节,减少了API的数量,提高了易用性。例如,EnumSet中,创建一个空的enum set1
2
3
4
5
6
7
8
9
10public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}如果,枚举类型的元素个数不超过64个则返回RegalarEnumSet实例,否则返回JumboEnumSet实例。而RegalarEnumSet类的定义:
不是public的类1
class RegularEnumSet<E extends Enum<E>> extends EnumSet<E>
- 在创建参数化类型实例的时候,静态工厂方法使代码变得更加简洁。
构造器:1
Map<String,List<String>> m = new HashMap<String,List<String>>();
静态工厂:
1
2
3
4public static <k,v> HashMap<k,v> newInstance(){
return new HashMap<k,v>();
}
Map<S- 在创建参数化类型实例的时候,静态工厂方法使代码变得更加简洁。
静态工厂方法缺点
- 一个类如果没有public或protected的构造器,就不能被继承。
- 静态工厂方法只是普通的静态方法,并没有特别标识,所以对于使用者来说,并不能确定哪个静态方法才是用来实例化的。
这方面可以通过javadoc工具识别特定的注释来生成详细的API文档。目前,还没有实现。那么记一些常用的静态工厂方法名可能会有用:
- valueOf:实际上是类型转换的方法
- of: valueOf简略版
- getInstance
- newInstance:每次返回一个新建的实例
- get_Type_:与getInstance一样,_Type_表示返回实例的类型。
- new_Type_:对应netInstance,_Type_表示返回实例的类型。