2011-05-14 22 views

回答

4

是的,它是安全的默認:

object Singleton extends Serializable 
// with Scala 2.8: @serializable object Singleton 

import java.io._ 

val out = new ObjectOutputStream(new FileOutputStream("singleton")) 
out.writeObject(Singleton) 
out.close 

val in = new ObjectInputStream(new FileInputStream("singleton")) 
val obj = in.readObject 
in.close 

obj == Singleton // should print true 

當您編譯scalac對象和反編譯它(例如用JAD),你會得到下面的Java文件:

public final class Singleton$ implements Serializable, ScalaObject 
{ 
    public Object readResolve() 
    { 
     return MODULE$; 
    } 

    private Singleton$() 
    { 
    } 

    public static final Singleton$ MODULE$ = new Singleton$1(); 
} 
+1

爲什麼是'Singleton'默認情況下不可序列化? – soc 2011-05-15 18:45:42

+0

@soc - 這個問題沒有什麼不同,爲什麼所有類型默認情況下都是不可序列化的 - 這裏有一個Java問題[here](http://stackoverflow.com/questions/441196/why-java-needs-序列化接口)。 – McDowell 2011-05-15 19:09:03

+1

我不同意。基本上只有一個(在99.5%的用例中)明智地實現了對單例模式的序列化,如果需要,它很容易被覆蓋。我只是想知道,這140字節保存是否是_that_重要的是默認情況下允許打破單身合同。 – soc 2011-05-15 20:59:46