论坛首页 Java企业应用论坛

为什么需要Singleton

浏览 48043 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-06-07  
如果单例对象需要 a. 从反序列化得来, b. 用Spring这样的框架装配而成,c. 根据实际的运行环境,向单例的构造函数传递不同的参数,那么使用类的静态成员就是不合适的。如果没有这些要求,以类为单例是足够了。

2 请登录后投票
   发表时间:2009-06-07  
确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全
0 请登录后投票
   发表时间:2009-06-07  
fjlyxx 写道

将类定义为final吧

为什么要将类定义为 final 呢
即使被其他类继承 ,它的状态还是唯一的
它的子类可以使用父类的静态方法和静态属性
,却不会在内存中创造一份父类静态方法和静态
属性的的拷贝,
类的状态是唯一的,不能通过继承复制它,只能
通过特定接口访问它
0 请登录后投票
   发表时间:2009-06-07   最后修改:2009-06-07
把构造函数私有化的那步放到最终具体类中,依然能用多态啊。


原型的对象系统就没这个问题,既然没有 class,就没有特意弄 singleton 的必要了。
引用
In a prototype-based programming language, where objects but not classes are used, a "singleton" simply refers to an object without copies or that is not used as the prototype for any other object. Example in Io:

Foo := Object clone
Foo clone := Foo
0 请登录后投票
   发表时间:2009-06-07  
frenchmay 写道
确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全


线程安全很重要,但这不是讨论的重点
问题是 单例能线程安全 ,类也能线程安全啊。
为什么用单例 而 不用用静态属性和静态方法构造的类
来表达这种唯一性呢?
0 请登录后投票
   发表时间:2009-06-07   最后修改:2009-06-07
步行者 写道
frenchmay 写道
确保当前虚拟机中只存在一份类的实例,为了在不同对象中安全地共享对象。
另外你写的这个单例的方法并非线程安全


线程安全很重要,但这不是讨论的重点
问题是 单例能线程安全 ,类也能线程安全啊。
为什么用单例 而 不用用静态属性和静态方法构造的类
来表达这种唯一性呢?


感觉不到好处就别用。不要成为 Stinkleton。
另外用 DI 就已经很方便了,现在手写 singleton 已经成为反模式了……
0 请登录后投票
   发表时间:2009-06-07  
楼主的做法是单了,可惜没有"例"
静态属性和静态方法的做法不是说不可以达到目标,只是这样做初始化工作就交给了JVM,这样的做法基本丧失了主控性,也不利于测试,那么既然单例的做法更好,何乐不为呢?
0 请登录后投票
   发表时间:2009-06-07  
treenode 写道
如果单例对象需要 a. 从反序列化得来, b. 用Spring这样的框架装配而成,c. 根据实际的运行环境,向单例的构造函数传递不同的参数,那么使用类的静态成员就是不合适的。如果没有这些要求,以类为单例是足够了。



你的这三种情况 是针对对象的,因为类不是对象,确实不能满足。
不过类可以通过其他途径满足 这三种情况所要达到的目的。
a , 对象序列化 确实不保存 静态属性,但类的内部状态不是不可以保存并恢复的。
b , Spring 容器是管理对象的,当然不能管理类,类也不需要管理,因为它只有一个
索引它只需要类名就可以了。
c , 对象才有构造函数 ,类当然没有。但类可以使用静态初始化方法初始化类的内部状态。
0 请登录后投票
   发表时间:2009-06-07  
flyspider 写道
楼主的做法是单了,可惜没有"例"
静态属性和静态方法的做法不是说不可以达到目标,只是这样做初始化工作就交给了JVM,这样的做法基本丧失了主控性,也不利于测试,那么既然单例的做法更好,何乐不为呢?


如果对象不是单例,这种说法我就接受了
因为对象是单例,它的初始化实际上分为两步的:
    1,加载单例对应的类
    2,创建一个单例
而类也只会被加载一次,而且不一定非要在加载时 把所有的初始化工作都做了。
我们也可以在使用前做初始化工作。
所以我不觉得这是单例的优势!
0 请登录后投票
   发表时间:2009-06-07   最后修改:2009-06-07
楼主,你说的其实没问题,单例就是一个全局访问点,用全部是静态变量和静态方法的类来做同样可以。我看过这样的讨论,最后的结论是单例模式比之全静态类来说唯一的好处就是,你可以很容易将单例改成多实例,这个理由很薄弱。

1 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics