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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 任江峰 于 2013-5-21 09:10 编辑

老师说,枚举只有一个成员时,就可以作为一种单例的实现方式。
那枚举用作单例,在多线程的访问下是否线程安全?
它和我们自己实现的懒汉式、饿汉式单例设计模式有何异同?和它们相比效率怎么样?

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
袁梦希 + 1 + 3 赞一个!

查看全部评分

5 个回复

正序浏览
【黑马云青年】知识有限,只能给你顶顶

点评

To
技术性的黑马云青年才可以加金币哦。哈哈。坑死军团长!  发表于 2013-5-22 16:00
回复 使用道具 举报
任江峰 发表于 2013-5-21 09:10
很专业啊,谢谢。就像你说的,枚举用作单例应该是相当于是饿汉式。
我查了一下资料,要继承单例类,可以 ...

登记式单例。。。学习了,以前都没听过,查了下资料,蛮麻烦的。。。
回复 使用道具 举报
Miss小强 发表于 2013-5-21 00:03
效率问题说实话我到真不知道,可是从代码上明显更简单,可读性也较好;
唯一的不足我认为应该是扩展性问题 ...

很专业啊,谢谢。就像你说的,枚举用作单例应该是相当于是饿汉式。
我查了一下资料,要继承单例类,可以用另外一种单例模式,登记式单例。
回复 使用道具 举报
效率问题说实话我到真不知道,可是从代码上明显更简单,可读性也较好;
唯一的不足我认为应该是扩展性问题吧。
因为如果是普通Java类描述的单例设计模式,我们通常所说的将构造函数私有化是有一定问题的,因为如果这样的话,这个
单实例的类就是一个final类,不能有子类(想想为什么。。。),因为无扩展性可言,因此出于扩展性考虑,我们通常建议将构造函数
设置了保护权限,这样就可以有子类了(想想为什么)。说到这里就清楚了,因为枚举中构造函数默认是私有的,也就是说枚举不能被继承;
因此毫无扩展性可言。。。
这是我的一点看法,希望对你有帮助。。。云青年。。。
回复 使用道具 举报
个人观点:
枚举不是可以用一个Java类进行模拟吗?
他的每一个成员都是一个常量,既然是一个常量那么肯定就是事先初始化好的并且公有静态;
从思想上看属于饿汉式,不存在线程安全问题;即你可以这样理解:
  1. public class Single{
  2.         private Single(){}
  3.         public static Single instance=new Single();
  4. }
复制代码
这就是用一个普通的Java类代指的枚举;


回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马