论坛首页 Java企业应用论坛

java利用class的load机制实现单例模式

浏览 7310 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (16) :: 隐藏帖 (0)
作者 正文
   发表时间:2012-10-24  
做实验了没? 确定是lazy?
0 请登录后投票
   发表时间:2012-10-24  
单例模式最简单,但是最容易出错的模式
0 请登录后投票
   发表时间:2012-10-24  
zhukewen_java 写道
LZ上的一段代码不简洁,冗余。
这样更好:
public class Singleton {

      public static Singleton getInstance() {
  
        return SingletonLazy.lazy;
        
        
    }

    private static class SingletonLazy {
        public static Singleton lazy = new Singleton();
    }

}



一般都用这种方法的
0 请登录后投票
   发表时间:2012-10-24  
我还是喜欢饿汉式。
0 请登录后投票
   发表时间:2012-10-24  
少年,太会玩了。。。
比起这个,记得加上private的构造函数
0 请登录后投票
   发表时间:2012-10-25  
hgpeng 写道
zhukewen_java 写道
LZ上的一段代码不简洁,冗余。
这样更好:
public class Singleton {

      public static Singleton getInstance() {
  
        return SingletonLazy.lazy;
        
        
    }

    private static class SingletonLazy {
        public static Singleton lazy = new Singleton();
    }

}



一般都用这种方法的


正解。《Effective Java中文版》第9章166页的标准代码,原文中称这个是“按需初始化容器类”(initialize-on-demand holder class)模式。
0 请登录后投票
   发表时间:2012-10-29  
dohkoos 写道
没看出哪边lazy了,难道是有个lazy名字就lazy了?


其实是lazy。但真正的我想表达的是相比以下这段代码它lazy了吗?

instance = new Instance();

这段代码也是在instance为null时创建一个实例,而且也不必像lz的代码那样再去加载一个类。

那么,lz代码的优势在哪里?不会出现同步问题,不知是不是classloader加载类时是单线程的。离看《Effective java》的时间太遥远了,要再去温习下了。
0 请登录后投票
   发表时间:2013-07-07  
单例模式最佳实现:
public class Singleton {
        // Private constructor prevents instantiation from other classes
        private Singleton() { }

        /**
        * SingletonHolder is loaded on the first execution of Singleton.getInstance()
        * or the first access to SingletonHolder.INSTANCE, not before.
        */
        private static class SingletonHolder {
                public static final Singleton INSTANCE = new Singleton();
        }

        public static Singleton getInstance() {
                return SingletonHolder.INSTANCE;
        }
}
出处:
http://en.wikipedia.org/wiki/Singleton_pattern
0 请登录后投票
论坛首页 Java企业应用版

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