2010-06-27 9 views
9

Mój projekt zawiera niewielką abstrakcję bazy danych, w której każdą bazę danych zaimplementuję jako Singleton (cóż, object), z niestandardowymi metodami w bazie danych dla kilku operacji wywoływanych przez kod (jest to głównie analizator składni dziennika, zrzucając interesujące statystyki do baza danych).W Scala, jak dałbym Singletonowi konstruktor?

Chciałbym zbudować klasy baz danych Singleton, jeśli to możliwe, tak aby w czasie wykonywania, każdy był skonstruowany z wartościami konfiguracyjnymi (i te wartości pozostają stałe dla pozostałej części środowiska wykonawczego programu). To pozwoliłoby mi lepiej przetestować kod (ponieważ mogę kpić z baz danych za pomocą Mockito lub innych).

Wciąż uczę się tylko Scali, ale wygląda na to, że nie ma sposobu na dołączenie konstruktora do Singletona, i docenilibyśmy każdy wkład w ten problem - czy jest lepszy sposób na robienie tego, co robię? Czy istnieje jakiś preferowany sposób konstruowania Singleton?

Pozdrawiam z góry za pomoc.

Odpowiedz

13

Wystarczy umieścić kod konstruktora w ciele definicji obiektu:

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

Thanks mnóstwo dla szybkiej reakcji. Obawiam się, że chcę przekazać argumenty konstruktorowi. Ale wracając do tego, zdaję sobie sprawę, jaki to jest brudny hack. Muszę ponownie rozważyć mój projekt. – frio

+1

Tak, to jest hack. Singletony są stanem globalnym, a punktem Scala jest umożliwienie niewidzialnego przetwarzania równoległego. Oznacza to, że nie możesz mieć stanu globalnego. – fishtoprecords

+1

@frio, może być istotne, aby pamiętać, że konstruktor obiektu (ciało) nie jest wykonywany, dopóki nie odniesiesz się do obiektu lub jego zawartości (pól lub metod), która daje pewną kontrolę nad konstrukcją obiektu. –

4

Zamiast używać singleton (co jest trudne do sprawdzenia) .. Ktokolwiek tworzenia aktorów mogłyby utworzyć fabrykę sesji bazy danych i przekazać do każdego aktora, to jest nadal udostępniane ... i testowalne.

+0

To wcale nie jest zły pomysł. Myślę, że sposób, w jaki ustaliłem, jest indywidualną klasą abstrakcji DB dla każdego aktora (zamiast wspólnego singletona), i tak, przekazując mu fabrykę przy starcie (chociaż myślałem, że Scala pomoże mi zostawić kilka wzorów GoF;)). Dzięki Nigel. – frio

0

Nie wiem, czy to jeśli to jest to, czego szukasz, ale jak artykuł wyjaśnia, należy zastosować metodę zastosować bez rozszerzania klasy bazowej

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

enter link description here