黑马程序员技术交流社区

标题: 懒汉式小问题 [打印本页]

作者: 包晗    时间: 2012-7-11 18:11
标题: 懒汉式小问题
本帖最后由 包晗 于 2012-7-11 23:25 编辑
  1. class Single
  2. {
  3. private static Single s =null;
  4. private Single(){}
  5. public static Single getInstance()
  6. {
  7. if(s==null)
  8. return s;
  9. }
  10. }
复制代码
请教一下  我没弄懂 s要判断是否等于NULL      
作者: 龙秋地    时间: 2012-7-11 18:18
本帖最后由 龙秋地 于 2012-7-11 18:54 编辑

首先你的代码有问题,就是if(s=null),接下来的语句应该是s = new Single();
因为刚开始的语句是private static Single s =null;
这时候只声明了Single的引用,但是却没创建对象.所以s是null为空.
懒汉式是单例设计模式的一种,目的就是只能创建一个对象,
而在调用getInstance()方法的时候,为了只创建一个对象的这个目的,
所以要验证一下是否已经有了这个对象,如果s=null,则说明没有这个对象,
所以才能执行return s;这个语句,来返回创建的一个对象.
作者: 丁二跃    时间: 2012-7-11 18:30
懒汉式,从总字面上就可以理解,  懒吗,不用他的时候他就不去实例化,只有在用到时才去实例化。

所以一开始设为 null  再调用到他时他开始实例化一个实例,而由于是单例 内存只有一份 所以只用实例化一次。在 getInstance()
方法内 每当获取实例对象时 判断 是否为null  若为空,说明是第一次访问就要实例化,否则说明对象已存在,直接返回就行了
作者: 黑马振鹏    时间: 2012-7-11 18:40
private static Single s =null;
此时并没有创建对象
public static Single getInstance()
{
if(s==null)
return s;
}
s==null用来判断是否已经创建,如果没有 那么就创建一个。第二次访问的时候就直接返回了。保证了唯一性


作者: 曹恒业    时间: 2012-7-11 18:48
当程序需要建立单例的时候,才会建立Single对象,所以需要先判断Single的s引用是否为空。
其实要理解懒汉式,最好要结合饿汉式来对比着理解,才容易懂。
懒汉式建立的对象是方法被调用时,才初始化,这属于对象的延时加载。Single类进内存时,对象还没有存在,只有调用了getInstance方法时,才建立对象。
而饿汉式,是直接在类加载的时候就建立Single实例,这样做简洁明了,正是因为是static,只在类加载时才建立一次,所以就不需要在建立的语句前判断Single引用是否为null了。
另外,lz代码有问题,


现实中使用还需要加锁 ,这是实际中应用的方式。
class Single
{
        private static Single s = null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                {
                        synchronized(Single.class)
                        {                               
                                if(s==null)
                                        s = new Single();
                        }
                }
                return s;
        }
}


作者: 包晗    时间: 2012-7-11 18:56
龙秋地 发表于 2012-7-11 18:18
首先你的代码有问题,就是if(s=null),接下来的语句应该是s = new Single();
因为刚开始的语句是private stat ...

single 类进了内存,对象还没弄出来  
是吗?
作者: 龙秋地    时间: 2012-7-11 19:54
包晗 发表于 2012-7-11 18:56
single 类进了内存,对象还没弄出来  
是吗?

恩 是的 Single类的引用是在栈内存中,只有new了对象,才算创建类的对象,
而且new出的对象都在堆内存中.
作者: 包晗    时间: 2012-7-11 23:25
谢谢大家了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2