静态方法介绍
对于一个类,拿到它自身的一个实例,我们通常是调用公有的构造器,但是还有一种方法-静态工厂方法,在某些情况下可以更加方便返回类的实例。
静态工厂-返回类的一个实例的静态方法。
静态方法应用举例
在Boolean这个类中,有个valueOf方法,我们来看看它的源代码:
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
查看一个TRUE和FALSE在Boolean中的定义
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
我们从上面可以看出:
- valueOf方法是static的,是静态的
- valuof方法返回的是Boolean的一个已经实例化好的实例,而且这个实例是可以重复利用的
优势
优点一:构造器方法名写死,静态工厂方法可以改名称,让人顾名思义
类的构造方法是写死的,例如类User的构造方法名只能为User,如果是使用静态工厂方法,名称为createUser,这样人家一看就知道这样方法是干什么用的了。
优点二:静态工厂方法可以做到每次调用的时候都不必创建一个对象
在静态方法中,我们可以预先创建一个对象,每次返回一个该对象,就不用创建了,前提是调用者使用同一个对象不会出现问题
/**
* User类
* @author xujianguo
*
*/
public class User {
/**
* 创建静态不可变的对象
*/
private static final User user = new User();
/**
* 静态工厂方法
* 返回唯一的实例
* @return
*/
public static User newInstance() {
return user;
}
}
优点三:静态工厂方法可以返回原返回类型的任何子类的对象
构造方法只能返回该类的对象,而静态工厂方法可以利用多态,返回该类的子类的对象。
/**
* Father类
* @author xujianguo
*/
class Father {
/**
* 构造方法
*/
public Father() {}
/**
* say方法
*/
public void say() {
System.out.println("Father say");
}
/**
* 静态工厂方法
* 根据index来返回对象,可以返回该类的子类的对象
* @param index
* @return
*/
public static Father newInstance(int index) {
switch(index) {
case 1:
return new Son1();
case 2:
return new Son2();
default:
return new Father();
}
}
}
/**
* Son1类
* 继承Father
* @author xujianguo
*/
class Son1 extends Father {
public void say() {
System.out.println("Son1 say");
}
}
/**
* Son2类
* 继承Father
* @author
*/
class Son2 extends Father {
public void say() {
System.out.println("Son2 say");
}
}
缺点
缺点一:静态工厂方法与其他静态方法没有什么区别
静态工厂方法的作用是跟构造方法一样的,但是却在定义上跟其他静态方法没有区别,这样开发者很难在一堆静态方法中找到静态工厂方法来创建对象。
缺点二:若类没有提供公有的构造方法,就不能自己写静态方法去创建对象