一、静态工厂方法
类可以提供一个公有的静态工厂方法,它只是一个返回类的实例的静态方法。
public static Boolean valueOf(boolean b){
return b ? Boolean.TRUE : Boolean.FALSE;
}
静态工厂方法和公有的构造器都各有各的用处,我们需要理解他们各自的长处。静态工厂经常更加合适,因此切记第一反应就是提供公有的构造器,而不先考虑静态工厂。
new做了什么?
当我们用new创建一个对象时,JVM就会在内存中开辟一片空间,然后调用构造函数初始化变量,最终把引用返回。
通过new创建出来的对象无法控制对象的行为,当我们对一个类不熟悉时要慎用。通过静态工厂方法能够增大类的提供者对自己所提供的类的控制力。
二、优势
1.有名称
静态工厂方法能确切的描述被返回的对象,可读性更好。当一个类需要多个构造器时,能突出他们的区别。
BigDecimal decimal = BigDecimal.valueOf(1);
Calendar calendar = Calendar.getInstance();
2.不必在每次调用它们的时候都创建一个新的对象
可以预先构建出一个实例缓存起来,不用每次都new,避免创建不必要的重复对象。实际应用中,单例方法大都用静态工厂方法实现。
//饿汉
public class Single {
private static final Single INSTANCE = new Single();
private Single() {
}
public static Single getInstance() {
return INSTANCE;
}
}
3.他们可以返回原返回类型的任何子类型的对象(里氏替换)
API可以返回对象,又不会使对象的类变成公有的。
Java8之后,接口可以包含静态方法,公有的静态成员应该被放到接口中。
Java9中允许接口有私有的静态方法,但是静态域和静态成员类仍然需要是公有的。
static class Person{
public static Person getInstance(){
return new Men();
}
}
static class Men extends Person{
}
4.所返回的对象的类可以随着每次调用而发生变化,这取决于静态工厂方法的参数值
public class Student {
private String name;
private Integer age;
public static Student newInstance(String _name,Integer _age){
Student student = new Student();
student.name = _name;
student.age = _age;
return student;
}
public static Student newInstanceWithName(String _name){
Student student = new Student();
student.name = _name;
return student;
}
public static Student newInstanceWithAge(Integer _age){
Student student = new Student();
student.age = _age;
return student;
}
}
5.方法返回的对象所属的类,在编写包含该静态工厂方法的类时可以不存在
缺点
1 类如果不含公有的或者受保护的构造器,就不能被子类化
2 程序员很难发现它们
静态工厂方法常用名称
- from 类型转换方法
- of 聚合方法
- valueOf from和of的替代
- instance或getInstance 返回实例
- create或newInstance 每次调用都返回一个新的实例