Какие гарантии имеют синглтоны Scala в отношении сериализации? - PullRequest
15 голосов
/ 15 мая 2011

Безопасно ли это по умолчанию, как шаблон одноэлементного перечисления в Java, или необходимо, например, определить readResolve или аналогичные методы где-нибудь, чтобы предотвратить случайный или злонамеренный разрыв одноэлементного контракта?

1 Ответ

4 голосов
/ 15 мая 2011

Да, по умолчанию это безопасно:

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();
}
...