2010-06-27 10 views
9

Mi diseño incorpora una pequeña abstracción de base de datos, implementando cada base de datos como Singleton (bueno, object), con métodos personalizados en la base de datos para el par de operaciones que el código llama (es principalmente un analizador de registro, descargando estadísticas interesantes a una base de datos).En Scala, ¿cómo le daría un Singleton a un constructor?

Me gustaría construir las clases de base de datos Singleton si es posible, de modo que en tiempo de ejecución, cada una se construya con valores de configuración (y esos valores permanezcan constantes durante el resto del tiempo de ejecución del programa). Esto me permitiría probar mejor el código también (ya que puedo burlarme de las bases de datos usando Mockito o algo así).

Todavía estoy aprendiendo Scala, pero parece que no hay forma de conectar un constructor a Singleton, y agradecería cualquier aporte sobre este problema. ¿Hay alguna manera mejor de hacer lo que estoy haciendo? ¿Hay alguna forma preferida de construir un Singleton?

Saludos de antemano por cualquier ayuda.

Respuesta

13

Sólo hay que poner el código del constructor en el cuerpo de la definición del objeto:

object Foo { 
    println("Hello") // This will print hello the first time 
        // the Foo object is accessed (and only 
        // that once). 
} 
+0

Gracias montones para la respuesta rápida. Mi preocupación con eso es que quiero pasarle argumentos al constructor. Sin embargo, pensando en ello, me estoy dando cuenta de lo sucio que es ese truco. Tendré que reconsiderar mi diseño. – frio

+1

Sí, es un truco. Los singletons son estado global, y el objetivo de Scala es permitir el procesamiento paralelo invisible. Esto significa que no puedes tener estado global. – fishtoprecords

+1

@frio, podría ser importante recordar que el constructor del objeto (cuerpo) no se ejecuta hasta que haga referencia al objeto o sus contenidos (campos o métodos) que le da cierta medida de control sobre la construcción del objeto. –

4

En lugar de utilizar un producto único (que es difícil de probar) .. Quien sea que la creación de los actores podría crear una fábrica de sesión de base de datos y transmitir a cada actor, luego aún se comparte ... y se puede probar.

+0

Eso no es una mala idea en absoluto. Creo que la forma en que me he acostumbrado es una clase de abstracción DB individual para cada Actor (en lugar de Singleton compartida), y sí, pasarle Factory al inicio (aunque pensé que Scala me ayudaría a dejar algunos patrones GoF atrás;)). Gracias Nigel. – frio

0

No estoy seguro si esto si esto es lo que estás buscando, pero como explica el artículo, utilice el método de aplicación sin extender la clase base

case class Foo(name:String) 
 
object Foo { def apply(name:String) = new Foo(name) }

enter link description here

Cuestiones relacionadas