首页 > 代码库 > 如何更好的创建java对象(1)

如何更好的创建java对象(1)

  上一篇我们意识到,在日常编码中,new方法常常被轻易的使用,但是某些场景下,对象实例不需要反复的创建,比如任务管理器。如果仍然使用new不断的创建对象,那必然浪费资源。由此我们来谈谈单例模式。

  单例,即只存在单个实例。下面我们指的都是单应用下的单例。

  想要实现单例,new不能对外界开放,所以构造方法需要设置为私有。同时为了外界访问,需要提供一个获取实例的方法。代码如下:

  

public class Demo {
	
	private final Demo demo = new Demo();
	
	private Demo(){
		
	}
	
	public Demo getInstance(){
		return demo;
	}
	
}

 成员属性demo在Demo类加载后就会被实例化赋值。这种方式称为饿汉式。缺点很明显:如果demo一直不需使用,那么为demo分配的内存一直处于浪费状态。我们是否可以在需要使用的时候再实例化呢?

 

public class Demo {
	
	private Demo demo;
	
	private Demo(){
		
	}
	
	public Demo getInstance(){
		if(demo==null){
			demo = new Demo();
		}
		return demo;
	}
	
}

 在单线程情况下,Demo类型确实是单实例的(不考虑通过序列化产生的demo对象)。那么多线程情况下呢,仍然可能创建多个实例。如何修改呢?

public class Demo {
	
	private Demo demo;
	
	private Demo(){
		
	}
	
	public Demo getInstance(){
		if(demo==null){
			synchronized (this) {
				demo = new Demo();
			}
		}
		return demo;
	}
	
}

 我们使用同步的方式已经可以实现多线程情况下的单例。是否有其他更好的实现方法呢?

public class Demo {
	
	private Demo(){
		
	}
	
	private static class DemoInstance{
		public static final Demo demo = new Demo();
	}
	
	public Demo getInstance(){
		
		return DemoInstance.demo;
	}
	
}

 我们可以根据自己的喜好选择不同的创建方式。以上纯属个人理解,如有错误,敬请纠正。

 

如何更好的创建java对象(1)