先上代码,享元模式中的享元工厂类
package lab4;
import java.util.*;
public class IgoChessmanFactory {
private static IgoChessmanFactory instance=new IgoChessmanFactory();
private static Hashtable<String,IgoChessman> ht=new Hashtable<String,IgoChessman>();
public IgoChessmanFactory(){
IgoChessman white=new whiteChess("白色");
IgoChessman black=new blackChess("黑色");
//初始化单例存于ht中
ht.put("white",white);
ht.put("black",black);
}
public static IgoChessmanFactory getInstance(){
return instance;
}
public static IgoChessman getIgoChessman(String color){
//根据'w'或者'b',选择单例返回
if(color.equals("w")) {
return ht.get("white");
}
else if(color.equals("b")) {
return ht.get("black");
}
else {
return null;
}
}
}
运发现报空指针错误
修改Hashtable的创建位置,放到IgoChessmanFactory()初始化函数中,发现运行成功,代码如下
package lab4;
import java.util.*;
public class IgoChessmanFactory {
private static IgoChessmanFactory instance=new IgoChessmanFactory();
private static Hashtable<String,IgoChessman> ht;
public IgoChessmanFactory(){
ht= new Hashtable<String,IgoChessman>();
IgoChessman white=new whiteChess("白色");
IgoChessman black=new blackChess("黑色");
//初始化单例存于ht中
ht.put("white",white);
ht.put("black",black);
}
public static IgoChessmanFactory getInstance(){
return instance;
}
public static IgoChessman getIgoChessman(String color){
//根据'w'或者'b',选择单例返回
if(color.equals("w")) {
return ht.get("white");
}
else if(color.equals("b")) {
return ht.get("black");
}
else {
return null;
}
}
}
再次修改Hashtable的位置,放到“IgoChessmanFactory instance”初始化函数成员变量的前面,发现也能运行成功,代码如下
package lab4;
import java.util.*;
public class IgoChessmanFactory {
private static Hashtable<String,IgoChessman> ht= new Hashtable<String,IgoChessman>();
private static IgoChessmanFactory instance=new IgoChessmanFactory();
public IgoChessmanFactory(){
IgoChessman white=new whiteChess("白色");
IgoChessman black=new blackChess("黑色");
//初始化单例存于ht中
ht.put("white",white);
ht.put("black",black);
}
public static IgoChessmanFactory getInstance(){
return instance;
}
public static IgoChessman getIgoChessman(String color){
//根据'w'或者'b',选择单例返回
if(color.equals("w")) {
return ht.get("white");
}
else if(color.equals("b")) {
return ht.get("black");
}
else {
return null;
}
}
}
结论
1、Java的jvm环境是懒加载的,类只有在真正使用的时候才会被真正加载进来
2、最开始的代码之所以报错,是因为,static修饰的“IgoChessmanFactory instance”成员变量会先于Hashtable的初始化执行,这时的Hashtable还没有创建就会报错。
3、所以虽然这几段代码都是用static修饰的,但是他们会先于其他代码运行,但因为懒加载所以也只是相当于声明了,在后面真正创建的时候才会执行。