锁定老帖子 主题:java关于单例模式的一些疑问?
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-04-12
各位大侠说的够明白了,偶就不多说了,想必也应该明白了吧
|
|
返回顶楼 | |
发表时间:2009-04-12
spring 的config里就有很多用Singlenon
|
|
返回顶楼 | |
发表时间:2009-04-12
一般singleton是用下面的写法,和楼主的写法区别在于,线程安全性,是用jvm来保证的
public class SingleTon { private SingleTon() { } public static SingleTon getInstance() { return Holder.singleTon; } private static class Holder{ private static SingleTon singleTon=createSingleTon(); private static SingleTon createSingleTon(){ //工厂方法,可以做一些你需要的初始化 return new SingleTon(); } } //.....其它的方法。。。。。。。 } 1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类) 2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。 3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。 4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。 |
|
返回顶楼 | |
发表时间:2009-04-13
JDK1.5以后还有一种写法,就是把这个单例的直接写成enum。这样也能保证单例
|
|
返回顶楼 | |
发表时间:2009-04-13
showtime520 写道 JDK1.5以后还有一种写法,就是把这个单例的直接写成enum。这样也能保证单例
的确,据joshua bloch说,这是单例应用的最佳方法。 |
|
返回顶楼 | |
发表时间:2009-04-13
所有的方法都是static,这种是最简单的单例。也是最有效的单例,呵呵。
|
|
返回顶楼 | |
发表时间:2009-04-13
jansel 写道 所有的方法都是static,这种是最简单的单例。也是最有效的单例,呵呵。 谢谢关注! |
|
返回顶楼 | |
发表时间:2009-04-13
zhaobohao 写道 一般singleton是用下面的写法,和楼主的写法区别在于,线程安全性,是用jvm来保证的public class SingleTon{ private SingleTon() { } public static SingleTon getInstance() { return Holder.singleTon; } private static class Holder{ private static SingleTon singleTon=createSingleTon(); private static SingleTon createSingleTon(){ //工厂方法,可以做一些你需要的初始化 return new SingleTon(); } } //.....其它的方法。。。。。。。}1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类)2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。 很详细!谢谢! |
|
返回顶楼 | |
发表时间:2009-04-13
最后修改:2009-04-13
以单元素的枚举类型来实现单例总觉得有点怪怪的,
比如以下代码 import java.util.*; public enum Catalog { soleInstance; private Map<String,Book> books = new HashMap<String,Book>(); public void add(Book book) { books.put(book.getClassification(), book); } public Book get(String classification) { return books.get(classification); } //其他的一大堆的方法... } 枚举内的方法少一点的话感觉看上去还算舒服,如果方法有6、7个之多,私有变量也很多, 因为习惯了通常的class方式,看这样的enum有点接受不了 ,不知道这样使用是否违背了引入enum的初衷 |
|
返回顶楼 | |
发表时间:2009-04-13
单例 有没有想过用静态方法会怎么样?
|
|
返回顶楼 | |