返回信息流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();
这样实现的是不也是单例模式?
这是一条镜像帖。来源:北邮人论坛 / java / #45804同步于 2015/11/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
单例模式--内部类是否有必要
kwsyl
2015/11/23镜像同步19 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这是饿汉模式啊...
但是为啥要用内部工厂呢...
【 在 fuxuemingzhu (负雪明烛) 的大作中提到: 】
: 我只感觉没见过这么实现单例模式的。。都是判断instance是否为null。
这样的话,多线程的时候容易出问题 。。。
【 在 fuxuemingzhu 的大作中提到: 】
: 我只感觉没见过这么实现单例模式的。。都是判断instance是否为null。
https://en.wikipedia.org/wiki/Singleton_pattern
按这里的说法,如果private static Singleton instance = new Singleton();写在Singleton内,而不是SingletonHolder内的话,只要Singleton这个类被提到,就会马上创建一个Singleton实例。但是如果在SingletonHolder里的话,只有到调用Singleton.getInstance()的时候才会创建。
当然,我的观点是Singleton模式是个“反模式”,能不用就不用。
你的那种写法,单例对象在类加载的时候就会构建。
用了嵌套类,单例对象是在第一次调 getInstance() 时构建。
不过其实有更简单的写法:
public enum Singleton {
INSTANCE;
}
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是一个对象。
}
没有,这是在CSDN上面看到的。。。
【 在 hailixiansen 的大作中提到: 】
: 这个貌似是剑指offer上面教的?说是内部类只有在用到的时候才会加载,然后实现懒汉式?而且加载的很晚
毕竟是暖神。。。一语道破天机
【 在 nuanyangyang 的大作中提到: 】
: https://en.wikipedia.org/wiki/Singleton_pattern
: 按这里的说法,如果private static Singleton instance = new Singleton();写在Singleton内,而不是SingletonHolder内的话,只要Singleton这个类被提到,就会马上创建一个Singleton实例。但是如果在SingletonHolder里的话,只有到调用Singleton.getInstance()的时候才会创建。
: 当然,我的观点是Singleton模式是个“反模式”,能不用就不用。