Как создать правильно настраиваемый объект в Scala? Я смотрел видео Тони Морриса в монаде Reader
, и я все еще не могу подключить точки.
У меня есть жестко закодированный список объектов Client
:
class Client(name : String, age : Int){ /* etc */}
object Client{
//Horrible!
val clients = List(Client("Bob", 20), Client("Cindy", 30))
}
Я хочу, чтобы Client.clients
определялся во время выполнения, с гибкостью либо чтения его из файла свойств, либо из базы данных. В мире Java я бы определил интерфейс, реализовал два типа источника и использовал DI для назначения переменной класса:
trait ConfigSource {
def clients : List[Client]
}
object ConfigFileSource extends ConfigSource {
override def clients = buildClientsFromProperties(Properties("clients.properties"))
//...etc, read properties files
}
object DatabaseSource extends ConfigSource { /* etc */ }
object Client {
@Resource("configuration_source")
private var config : ConfigSource = _ //Inject it at runtime
val clients = config.clients
}
Это похоже на довольно чистое решение для меня (не много кода, четкое намерение), но что var
выпрыгивает (OTOH, мне это не кажется действительно хлопотным, так как я знаю, что это будет вводится один раз и только один раз).
Как бы выглядела монада Reader
в этой ситуации и объяснить ее мне, как будто мне 5, каковы ее преимущества?