Какими гарантиями имеют синглтоны Scala относительно сериализации?

Насколько это безопасно по умолчанию, например, шаблон Java single-element-enum или это e. г. необходимо определить readResolve или аналогичные методы где-нибудь, чтобы предотвратить случайный или вредоносный обрыв одноточечного контракта?

Ответы

Ответ 1

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

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

Когда вы скомпилируете объект со скаляром и декомпилируете его (например, с помощью JAD), вы получите следующий Java файл:

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

    private Singleton$()
    {
    }

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