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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗磊 中级黑马   /  2012-8-5 03:51  /  1789 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

枚举可做单例设计模式  与饿汉式有什么区别  开发如何选择!请指教!

评分

参与人数 1技术分 +1 收起 理由
张_涛 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
没啥太大的区别,比较常用为饿汉式,枚举最终是会被替代的
回复 使用道具 举报
本帖最后由 杨文宇 于 2012-8-5 14:20 编辑
  1. enum SingletonExample {
  2. INSTANCE;
  3. public static SingletonExample getInstance(){
  4. return INSTANCE;
  5. }
  6. }
  7. class Singleton{
  8. private static Singleton instance = new Singleton();
  9. private Singleton(){}
  10. public static Singleton getInstance() {
  11. return instance;
  12. }

  13. }
  14. public class EnumTest {
  15. public static void singletonTest() throws IllegalArgumentException, InstantiationException,
  16. IllegalAccessException, InvocationTargetException{
  17. try {
  18. /*//枚举
  19. * SingletonExample s = SingletonExample.getInstance();
  20. Class c = Class.forName("javaEnhance.SingletonExample");
  21. */
  22. //单例
  23. Singleton s = Singleton.getInstance();
  24. Class c = Class.forName("javaEnhance.Singleton");
  25. Constructor[] con = c.getDeclaredConstructors();
  26. Constructor conc = con[0];
  27. //值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
  28. conc.setAccessible(true);
  29. //创建枚举实例
  30. // SingletonExample ss = (SingletonExample)conc.newInstance();
  31. //创建饿汉式单例
  32. Singleton ss = (Singleton)conc.newInstance();
  33. System.out.println(s+"="+ss);
  34. } catch (ClassNotFoundException e) {
  35. e.printStackTrace();
  36. }
  37. }
  38. public static void main(String[] args) throws IllegalArgumentException,
  39. InstantiationException, IllegalAccessException, InvocationTargetException {
  40. singletonTest();
  41. }
  42. }
复制代码
上面使用暴力反射可以强行把饿汉式单例实例化,而无法将枚举实例化;
所以,使用枚举做单例比普通单例更安全,功能更强大(因为提供了更多方法。)
回复 使用道具 举报
使用暴力反射可以强行把懒汉式单例实例化,而无法将枚举实例化;
所以,使用枚举做单例比普通单例更安全,功能更强大(因为提供了更多方法。)
这个解释不错 那么我们开发时怎么选择 照上面这么说 懒汉 应该没什么用武之地啊
不过我觉得存在必定有它的用处 所以有什么地方可以只能用 懒汉 呢?
回复 使用道具 举报
枚举类单例和饿汉式的单例,有几个共同点,都是在加载类的时候就已经创建了实例对象,所以不能延迟加载。一般用于多线程是安全的。
但是饿汉式有一个缺点:当存在多个类加载器时,即使它们加载的是相同包名,相同类名甚至每个字节都完全相同的类,也会被区别对待的。因为不同的类加载器会使用不同的命名空间(namespace)来区分同一个类。因此,单例类在多加载器的环境下会产生多个单例对象。
而枚举类不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。相比较饿汉式更为安全,现在开发中好像提倡用枚举的多一些。
至于懒汉式的存在意义及用途,期待高手解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马