如何更好的创建java对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更好的创建java对象相关的知识,希望对你有一定的参考价值。

  上一篇我们意识到,在日常编码中,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对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在用java创建的布局内创建地图片段(GoogleMap)?

如何将 r ggplot 图存储为 html 代码片段

如何使用tablayout和片段管理java文件[关闭]

你如何在片段中膨胀动态创建的对象?

创建片段而不从 java 代码实例化它

java Ftp上传创建多层文件的代码片段