A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 包晗 中级黑马   /  2012-7-11 18:11  /  2371 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 包晗 于 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      

7 个回复

倒序浏览
本帖最后由 龙秋地 于 2012-7-11 18:54 编辑

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

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

回复 使用道具 举报
当程序需要建立单例的时候,才会建立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)
  •       s = new Single();               //源程序里没有创建对象的语句,
  •    return s;
  • }
  • }

现实中使用还需要加锁 ,这是实际中应用的方式。
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;
        }
}

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
龙秋地 发表于 2012-7-11 18:18
首先你的代码有问题,就是if(s=null),接下来的语句应该是s = new Single();
因为刚开始的语句是private stat ...

single 类进了内存,对象还没弄出来  
是吗?
回复 使用道具 举报
包晗 发表于 2012-7-11 18:56
single 类进了内存,对象还没弄出来  
是吗?

恩 是的 Single类的引用是在栈内存中,只有new了对象,才算创建类的对象,
而且new出的对象都在堆内存中.
回复 使用道具 举报
包晗 中级黑马 2012-7-11 23:25:22
8#
谢谢大家了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马