2010-06-27 15 views
9

Mein Entwurf enthält eine kleine Datenbankabstraktion, wobei ich jede Datenbank als Singleton (gut, ein object) mit benutzerdefinierten Methoden auf der Datenbank für die paar Operationen, die der Code aufruft, implementieren (es ist hauptsächlich ein Log-Parser, der interessante Statistiken zu eine Datenbank).In Scala, wie würde ich einem Singleton einen Konstruktor geben?

Ich möchte die Singleton-Datenbank-Klassen, wenn möglich, so konstruieren, dass zur Laufzeit jeder mit Config-Werten konstruiert wird (und diese Werte bleiben für den Rest der Laufzeit des Programms konstant). Dies würde es mir erlauben, den Code auch besser zu testen (da ich die Datenbanken mit Mockito oder Ähnlichem verspotten kann).

Ich lerne immer noch nur Scala, aber es scheint, dass es keine Möglichkeit gibt, einen Konstruktor an ein Singleton anzuhängen, und würde mich über jeden Input zu diesem Problem freuen - gibt es einen besseren Weg, um das zu tun? Gibt es einen bevorzugten Weg, ein Singleton zu konstruieren?

Prost im Voraus für jede Hilfe.

Antwort

13

Einfach den Konstruktor Code in dem Körper der Objektdefinition:

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

Dank Verlängerung Haufen für die schnelle Antwort. Meine Sorge dabei ist, dass ich dem Konstruktor Argumente übergeben möchte. Wenn ich daran zurückdenke, merke ich, was für ein schmutziger Hack das ist. Ich muss mein Design überdenken. – frio

+1

Ja, es ist ein Hack. Singletons sind ein globaler Zustand und der Punkt von Scala ist es, eine unsichtbare Parallelverarbeitung zu ermöglichen. Dies bedeutet, dass Sie keinen globalen Status haben können. – fishtoprecords

+1

@friend, kann es wichtig sein, daran zu denken, dass der Objektkonstruktor (Körper) nicht ausgeführt wird, bis Sie auf das Objekt oder dessen Inhalt (Felder oder Methoden) verweisen, was Ihnen ein gewisses Maß an Kontrolle über die Konstruktion des Objekts gibt. –

4

Anstatt einen Singleton zu verwenden (was zu testen ist hart) .. Wer die Schauspieler ist die Schaffung könnte eine Datenbanksitzung Fabrik erstellen und übergeben Es ist für jeden Schauspieler, dann ist es immer noch geteilt ... und testbar.

+0

Das ist keine schlechte Idee. Ich denke, die Art und Weise, auf die ich mich entschieden habe, ist eine individuelle DB-Abstraktionsklasse für jeden Akteur (anstelle eines geteilten Singleton), und ja, ich übergebe es beim Start an eine Fabrik (obwohl ich dachte, Scala würde mir helfen, ein paar GoF-Muster hinter mir zu lassen;)). Danke Nigel. – frio

0

nicht sicher, ob dies, wenn dies ist, was Sie suchen, aber wie der Artikel erklärt, die Methode anwenden verwenden, ohne die Basisklasse

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

enter link description here

Verwandte Themen