2010-06-27 5 views
9

Benim tasarım faaliyetlerinin çift için veritabanı üzerinde özel yöntemlerle, bir Singleton her veritabanı uygulamak sayede küçük bir veritabanı soyutlama, (iyi, bir object) içermektedir kod aramalar (o ilginç istatistikler damping ağırlıklı bir günlük ayrıştırıcı var bir veritabanı).Scala'da, bir Singleton'u bir kurucuya nasıl verebilirim?

Mümkünse Singleton veritabanı sınıflarını oluşturmak istiyorum, böylece çalışma zamanında her biri yapılandırma değerleriyle yapılandırılır (ve bu değerler programın çalışma zamanının geri kalanı için sabit kalır). Bu da kodu daha iyi test etmeme izin verir (Mockito veya benzeri bazı veritabanlarını kullanabileceğim gibi).

Hala Scala'yı öğreniyorum, ama bir Singleton'a bir kurucu eklemenin bir yolu yok gibi görünüyor ve bu sorunla ilgili herhangi bir girdi için minnettarım - yaptığım şeyi yapmanın daha iyi bir yolu var mı? Bir Singleton yapmanın tercih edilen bir yolu var mı?

Herhangi bir yardım için şimdiden şerefe.

cevap

13

Sadece nesne tanımı gövdesinde yapıcı kodu koymak:

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

Teşekkür uzatmadan uygulamak yöntemi kullanmak şeyin ise hızlı tepki için yığınlar. Bununla ilgili kaygım, yapıcıya argümanları aktarmak istiyorum. Tekrar düşünün, ne kadar kirli bir hack olduğunun farkındayım. Tasarımımı tekrar gözden geçirmem gerekecek. – frio

+1

Evet, bir kesmek. Singletonlar global durumdur ve Scala'nın noktası görünmez paralel işlemeye izin vermektir. Bu, küresel duruma sahip olamayacağınız anlamına gelir. – fishtoprecords

+1

@frio, nesne yapıcısı (gövdesi), nesneye veya nesnenin oluşturulmasına ilişkin bir miktar denetim sağlayan içeriğe (alanlar veya yöntemler) başvuru yapana kadar çalıştırılmayacağını hatırlamanız önemli olabilir. –

4

bir veritabanı oturumu fabrika oluşturup geçebileceği aktörleri yaratıyor Kim (test etmek zordur) a tek .. kullanmak yerine Her aktöre, o zaman hala paylaşılıyor ... ve test edilebilir.

+0

Bu hiç de kötü bir fikir değil. Bence yerleşmiş olduğum şey, her bir Oyuncu için ayrı bir DB soyutlama sınıfı (paylaşılan bir Singleton yerine) ve evet, başlangıçta bir Factory'yi geçirme (Scala'nın birkaç GoF modelini geride bırakmama yardım etmesine rağmen);)). Teşekkürler Nigel. – frio

0

emin değil ise, bu Aradığınız ancak makale açıkladığı gibi, taban sınıf

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

enter link description here