BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #45804同步于 2015/11/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

单例模式--内部类是否有必要

kwsyl
2015/11/23镜像同步19 回复
public class Singleton { /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 此处使用一个内部类来维护单例 */ private static class SingletonFactory { private static Singleton instance = new Singleton(); } /* 获取实例 */ public static Singleton getInstance() { return SingletonFactory.instance; } /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ public Object readResolve() { return getInstance(); } } 上面的代码要实现单例模式,去掉内部类可行么? 在类中声明静态变量: private static Singleton instance = new Singleton(); 这样实现的是不也是单例模式?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
fuxuemingzhu机器人#1 · 2015/11/23
我只感觉没见过这么实现单例模式的。。都是判断instance是否为null。
icyfox机器人#2 · 2015/11/23
这是饿汉模式啊... 但是为啥要用内部工厂呢... 【 在 fuxuemingzhu (负雪明烛) 的大作中提到: 】 : 我只感觉没见过这么实现单例模式的。。都是判断instance是否为null。
kwsyl机器人#3 · 2015/11/23
这样的话,多线程的时候容易出问题 。。。 【 在 fuxuemingzhu 的大作中提到: 】 : 我只感觉没见过这么实现单例模式的。。都是判断instance是否为null。
nuanyangyang机器人#4 · 2015/11/23
https://en.wikipedia.org/wiki/Singleton_pattern 按这里的说法,如果private static Singleton instance = new Singleton();写在Singleton内,而不是SingletonHolder内的话,只要Singleton这个类被提到,就会马上创建一个Singleton实例。但是如果在SingletonHolder里的话,只有到调用Singleton.getInstance()的时候才会创建。 当然,我的观点是Singleton模式是个“反模式”,能不用就不用。
kayla机器人#5 · 2015/11/23
你的那种写法,单例对象在类加载的时候就会构建。 用了嵌套类,单例对象是在第一次调 getInstance() 时构建。 不过其实有更简单的写法: public enum Singleton { INSTANCE; }
nuanyangyang机器人#6 · 2015/11/23
p.s. 安利一下Scala语言:有语言级的单例语法: object Singleton { val a = 42 var b = 84 def c(x: Int): Unit = { b = b + x } } object Foo extends Runnable { override def run():Unit = { println("Hello world") } } object Main extends App { Singleton.c(42) println(Singleton.b) val t = new Thread(Foo) // 没错,Foo是一个对象。 }
hailixiansen机器人#7 · 2015/11/24
这个貌似是剑指offer上面教的?说是内部类只有在用到的时候才会加载,然后实现懒汉式?而且加载的很晚
kwsyl机器人#8 · 2015/11/24
没有,这是在CSDN上面看到的。。。 【 在 hailixiansen 的大作中提到: 】 : 这个貌似是剑指offer上面教的?说是内部类只有在用到的时候才会加载,然后实现懒汉式?而且加载的很晚
kwsyl机器人#9 · 2015/11/24
毕竟是暖神。。。一语道破天机 【 在 nuanyangyang 的大作中提到: 】 : https://en.wikipedia.org/wiki/Singleton_pattern : 按这里的说法,如果private static Singleton instance = new Singleton();写在Singleton内,而不是SingletonHolder内的话,只要Singleton这个类被提到,就会马上创建一个Singleton实例。但是如果在SingletonHolder里的话,只有到调用Singleton.getInstance()的时候才会创建。 : 当然,我的观点是Singleton模式是个“反模式”,能不用就不用。