黑马程序员技术交流社区
标题:
关于单例模式的一个问题
[打印本页]
作者:
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