首页 > 代码库 > 如何更好的创建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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。