2010-06-27 10 views
9

Il mio progetto incorpora una piccola astrazione del database, per cui implemento ciascun database come Singleton (beh, uno object), con metodi personalizzati sul database per le operazioni che eseguono il codice (è principalmente un parser di log, che scarica statistiche interessanti per un database).In Scala, come potrei dare a Singleton un costruttore?

Mi piacerebbe costruire le classi di database Singleton se possibile, in modo tale che in fase di esecuzione, ciascuna sia costruita con valori di configurazione (e tali valori rimangano costanti per il resto del runtime del programma). Questo mi permetterebbe di testare meglio il codice (dato che posso prendere in giro i database usando Mockito o altri).

Sto ancora imparando solo Scala, ma sembra che non ci sia modo di collegare un costruttore a un Singleton e apprezzare qualsiasi input su questo problema - c'è un modo migliore per fare quello che sto facendo? C'è un modo preferito di costruire un Singleton?

Applausi in anticipo per qualsiasi aiuto.

risposta

13

appena messo il codice del costruttore nel corpo della definizione dell'oggetto:

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

Grazie mucchio per la pronta risposta. La mia preoccupazione è che voglio passare argomenti al costruttore. Ripensandoci però, mi sto rendendo conto di cosa sia uno sporco trucco. Dovrò riconsiderare il mio progetto. – frio

+1

Sì, è un hack. I singleton sono uno stato globale e il punto di Scala è consentire l'elaborazione parallela invisibile. Questo significa che non puoi avere uno stato globale. – fishtoprecords

+1

@frio, potrebbe essere significativo ricordare che il costruttore oggetto (corpo) non viene eseguito fino a quando non si fa riferimento all'oggetto o ai suoi contenuti (campi o metodi) che forniscono una certa misura del controllo sulla costruzione dell'oggetto. –

4

Invece di utilizzare un Singleton (che è difficile da testare) .. Chi sta creando gli attori potrebbe creare una fabbrica di sessione di database e passare a ogni attore, quindi è ancora condiviso ... e testabile.

+0

Questa non è affatto una cattiva idea. Penso che il modo in cui mi sono ambientato sia una singola classe di astrazione DB per ogni attore (invece di un singolo Singleton), e sì, passandogli una Factory all'avvio (anche se pensavo che Scala mi avrebbe aiutato a lasciare dietro qualche pattern GoF;)). Grazie Nigel. – frio

0

Non sono sicuro se questo se questo è quello che stai cercando, ma come spiega l'articolo, utilizzare il metodo applicare senza estendere la classe base

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

enter link description here

Problemi correlati