object Single{
def say(){
println("Hello")
}
def main(args : Array[String]){
Single.say()
Single.say()
}
}
搞定。乍一看怎麼也不像是單例模式,更像是靜態方法的調用。我們來看一下這段代碼實際的執行流程就明白了
scalac Single.scala
javap -verbose Single$
這裏在反編譯的是Single而不是Single,是因爲scalac編譯生成了Single.class和Single.class這兩個文件。而實際代碼在Single$.class中,Single.class只是對Single$.class的一個調用。 反編譯得到
......
{
public static final Single$ MODULE$;
public static {};
Code:
Stack=1, Locals=0, Args_size=0
0: new #2; //class Single$
3: invokespecial #12; //Method "<init>":()V
6: return
public void say();
Code:
Stack=2, Locals=1, Args_size=1
0: getstatic #18; //Field scala/Predef$.MODULE$:Lscala/Predef$;
3: ldc #20; //String Hello
5: invokevirtual #24; //Method scala/Predef$.println:(Ljava/lang/Object;)
V
8: return
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this LSingle$;
LineNumberTable:
line 6: 0
public void main(java.lang.String[]);
Code:
Stack=1, Locals=2, Args_size=2
0: aload_0
1: invokevirtual #29; //Method say:()V
4: aload_0
5: invokevirtual #29; //Method say:()V
8: return
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 this LSingle$;
0 9 1 args [Ljava/lang/String;
LineNumberTable:
line 10: 0
line 11: 4
}
從這裏我們就可以看出上面這段Scala代碼所對應的Java代碼了。 首先,有一個Single$類型的static final的對象。並且有一個靜態化塊來初始化它。所以只有在第一次調用時纔會實例化此對象。在main方法中只是簡單的調用而已。
[b]Blog URL :[/b] [url]http://www.ivanpig.com/blog/?p=523[/url]