2010-06-27 2 views
9

Мой проект включает в себя небольшую абстракцию базы данных, посредством которой я реализую каждую базу данных как Singleton (ну, object), с настраиваемыми методами в базе данных для пары операций, вызываемых кодами (это в основном анализатор журналов, демпинг интересной статистики для база данных).В Scala, как я могу дать Singleton конструктору?

Я хотел бы построить классы базы данных Singleton, если это возможно, так что во время выполнения каждый из них сконструирован с конфигурационными значениями (и эти значения остаются постоянными для остальной части времени выполнения программы). Это позволило бы мне лучше проверить код (так как я могу издеваться над базами данных с помощью Mockito или некоторых таких).

Я все еще только изучаю Scala, но, похоже, нет способа присоединить конструктор к Singleton, и был бы признателен за любой вклад в эту проблему - есть ли лучший способ сделать то, что я делаю? Есть ли какой-то предпочтительный способ построения Singleton?

Приветствуется за любую помощь.

ответ

13

Просто поместите код конструктора в теле определения объекта:

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

Спасибо кучи для быстрого ответа. Мое беспокойство в том, что я хочу передать аргументы конструктору. Улыбаясь, хотя, я понимаю, какой грязный взломать. Мне нужно будет пересмотреть мой дизайн. – frio

+1

Да, его рубить. Синглтоны - это глобальное состояние, а точка Scala - это возможность невидимой параллельной обработки. Это означает, что вы не можете иметь глобальное состояние. – fishtoprecords

+1

@frio, может быть важно помнить, что конструктор объекта (тело) не выполняется до тех пор, пока вы не сделаете ссылку на объект или его содержимое (поля или методы), что дает вам определенную степень контроля над конструкцией объекта. –

4

Вместо того, чтобы использовать синглтон (что трудно проверить) .. Кто бы создание актеров может создать сеанс базы данных завода и передать это каждому актеру, тогда он по-прежнему делится ... и проверяется.

+0

Это неплохая идея. Я думаю, что способ, которым я обосновался, - это отдельный класс абстракции БД для каждого Актера (вместо общего Синглтона), и да, передавая ему Factory при запуске (хотя я думал, что Scala поможет мне оставить несколько шаблонов GoF;)). Спасибо, Найджел. – frio

0

Не уверен, если это, если это то, что вы ищете, но как статья объясняет, используйте метод применения без расширения базового класса

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

enter link description here