黑马程序员技术交流社区

标题: 关于单例模式的一个问题 [打印本页]

作者: Joyuang    时间: 2012-1-16 23:59
标题: 关于单例模式的一个问题
本帖最后由 钱兆元 于 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;
        }
}
作者: 刘基军    时间: 2012-1-17 09:17
当你再次调用Single.getInstance()方法,先判断s是否为空,若不是null,说明已经创建了Single对象,则不应该再创建新对象,直接返回已经创建过的Single对象即可,这样就可以保证“单例”了。
作者: 杨扬    时间: 2012-1-17 09:53
if(s==null)用于判断对象是否已经存在,不存在,这创建,存在,则返回该对象
作者: Joyuang    时间: 2012-1-17 09:56
ls两位,我是想问下先设置s为null,这一步有必要吗
作者: 孙玉伟    时间: 2012-1-17 11:02
设置null有必要,因为是单一模式吗,所以在执行前要保证为空,当执行到判断语句在进行判断是否为空。加上判断说明不止执行一次,所以要进行判断是否为空,希望能帮到你,楼上说的是对的。。。。
作者: 刘基军    时间: 2012-1-17 11:20
钱兆元 发表于 2012-1-17 09:56
ls两位,我是想问下先设置s为null,这一步有必要吗

规范书写
作者: 袁野    时间: 2012-1-17 15:28
保证对象是唯一性,若有A和B 分别去使用 getInstance()方法 当程序运行到这  s = new Single(); 创建了对象 A

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

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

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


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

作者: Joyuang    时间: 2012-1-31 20:06
已解决,多谢
作者: ponyworld    时间: 2012-2-1 14:16
我觉得没必要初始化为null,因为这是static的,默认就是null

判断if(s==null)目的是实例化一次。




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