用静态工厂方法代替构造器
准备知识
自动装箱:从基本数据类型转换成包装类型。
自动拆箱:从包装类型转换成基本数据类型。
包装类:
- number(数字类型)
- Byte(byte)
- Short(short)
- Integer(int)
- Long(long)
- Double(double)
- Float(float)
- Character(字符类型)
- Boolean(布尔值)
利用静态工厂方法来创建对象
当我们利用构造器创建对象时,如果构造器的参数很多会造成new的对象里要填写很多参数,很容易导致错误。而且每次都创建一个新的对象,肯定会占用大量内存,所以使用静态工厂方法可以解决这些问题。
private class Person {
private static Person person = null;
public static Person getInstance(){
if(person == null){
person = new Person();
}
return person;
}
}
静态工厂方法的优势
①每次调用静态工厂方法,都不会重复创建对象。
利用不可变类的设计原则,当对象总是重复创建,并且创建对象的代价很高,可以提高性能
final class Immutable {
private static final Immutable immutable = new Immutable();
public static Immutable getInstance(){
return immutable;
}
public static Immutable getImmutable() throws CloneNotSupportedException {
return (Immutable) immutable.clone();
}
}
②静态工厂方法名可以描述参数以及要返回对象,而构造器却不可以。
③静态工厂方法可以返回原对象类型的子类对象
例如jdk1.5中java.util.EnumSet类,它的静态工厂方法中根据枚举类型的元素个数来确定实例化哪个子类对象,当元素个数小于64时,实例化RegularEnumSet对象,大于64则实例化JumboEnumSet对象
/**
* Creates an empty enum set with the specified element type.
*
* @param elementType the class object of the element type for this enum
* set
* @throws NullPointerException if <tt>elementType</tt> is null
*/
pu