享元模式下,遇到Hashtable找不到报空指针错误的问题解决

先上代码,享元模式中的享元工厂类

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修饰的,但是他们会先于其他代码运行,但因为懒加载所以也只是相当于声明了,在后面真正创建的时候才会执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值