Java&Scala比較---設計模式(Singleton)

單例模式在Scala中就是一個默認實現的模式。 對於Java中的單例模式,請看[url]http://www.ivanpig.com/blog/?p=75[/url]。 雖然從代碼上看,單例模式很簡單。但是涉及到多線程問題,問題會很複雜。 Scala中完全不用擔心這個問題。
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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章