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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Joyuang 黑马帝   /  2012-1-16 23:59  /  2289 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 钱兆元 于 2012-1-31 20:45 编辑

单例模式的懒汉式,为什么要先设置s为null然后加if(s==null)判断
class Single
{
        private static Single s = null;
        private Single(){}
        public static Single getInstance()
        {
                if(s==null)
                        s = new Single();
                return s;
        }
}

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

9 个回复

倒序浏览
当你再次调用Single.getInstance()方法,先判断s是否为空,若不是null,说明已经创建了Single对象,则不应该再创建新对象,直接返回已经创建过的Single对象即可,这样就可以保证“单例”了。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
if(s==null)用于判断对象是否已经存在,不存在,这创建,存在,则返回该对象

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
ls两位,我是想问下先设置s为null,这一步有必要吗
回复 使用道具 举报
设置null有必要,因为是单一模式吗,所以在执行前要保证为空,当执行到判断语句在进行判断是否为空。加上判断说明不止执行一次,所以要进行判断是否为空,希望能帮到你,楼上说的是对的。。。。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
钱兆元 发表于 2012-1-17 09:56
ls两位,我是想问下先设置s为null,这一步有必要吗

规范书写
回复 使用道具 举报
袁野 黑马帝 2012-1-17 15:28:38
7#
保证对象是唯一性,若有A和B 分别去使用 getInstance()方法 当程序运行到这  s = new Single(); 创建了对象 A

这是已经有了个对象 当B在去调用getInstance()方法 又创建出了一个对象 此时AB俩个对象不是不是同一个对象

所以对象不唯一性 不符合单列模式 , 加上 if(s==null) 当B在去使用getInstance()方法 不为空不用创建对象 直接返回S; 这样就可以确定对象的唯一性 所以要加上if(s==null) 判断 是否创建过新的对象 。 说的有点罗嗦。

不建议使用懒汉模式;会出现线程的问题,、有安全问题,增加代码量; 开发时会使用:饿汉模式比较合理

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
张伟~ 黑马帝 2012-1-18 13:02:19
8#
按毕老师视频说的,这段代码本身就存在安全隐患,这涉及到多线程,这点楼主可把老师那两个单例模式的视频再仔细看下。
至于private static Single s = null;先把值设置为空,这也是保证程序的健壮性,在后期使用程序的过程中可能会出现各种各样的问题,不先给s初始化一个值,可能会导致程序出问题。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
Joyuang 黑马帝 2012-1-31 20:06:51
9#
已解决,多谢
回复 使用道具 举报
我觉得没必要初始化为null,因为这是static的,默认就是null

判断if(s==null)目的是实例化一次。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马