设计模式遇到scala-单例模式_singleton

Singleton是最常用的设计模式,其结构非常简单,但是用Java完成一个优美的单例并不是那么容易的事,如多线程下有Double-Checked Lock等问题。在Scala中一切都是那么的自然,object就是singleton!

单例代码:

Singleton.scala
object Singleton {
def say() = print("hello scala")
}

测试代码:

Test.scala
object Test extends App {
Singleton.say() //输出:hello scala
}

OK,简单到令人发指的地步。

接下来,我们用Java Decompiler反编译(直接javap也可以)看下Scala编译器编译后的class文件指令,看看原理如何:
从输出目录中可以看到Scala编译器将Singleton.scala编译生成了两个文件Singleton.class和Singleton$.class。

Singleton.java & Singleton$.java
/// Singleton.java
public final class Singleton
{
public static void say()
{
Singleton$.MODULE$.say();
}
}
/// Singleton$.java
public final class Singleton$
{
public static final MODULE$;
static
{
new ();
}
public void say()
{
Predef$.MODULE$.print("hello scala");
}
private Singleton$()
{
MODULE$ = this;
}
}

懒汉模式的单例。内行的看代码,不必多说。

评论