我希望我的客户端代码看起来像这样:
val config:Config = new MyConfig("c:/etc/myConfig.txt")
println(config.param1)
println(config.param2)
println(config.param3)
意思就是:
所以,我希望客户端代码友好,支持可互换的实现,具有静态类型的字段,隐藏延迟加载。我还希望它尽可能简单地进行替代实现,因此 Config 应该在一定程度上指导您。
到目前为止,我对我的想法并不满意:
trait Config {
lazy val param1:String = resolveParam1
lazy val param2:String = resolveParam2
lazy val param3:Int = resolveParam3
protected def resolveParam1:String
protected def resolveParam2:String
protected def resolveParam3:Int
}
class MyConfig(fileName:String) extends Config {
lazy val data:Map[String, Any] = readConfig
// some dummy impl here, should read from a file
protected def readConfig:Map[String,Any] = Map[String, Any]("p1" -> "abc", "p2" -> "defgh", "p3" -> 43)
protected def resolveParam1:String = data.get("p1").get.asInstanceOf[String]
protected def resolveParam2:String = data.get("p2").get.asInstanceOf[String]
protected def resolveParam3:Int = data.get("p3").get.asInstanceOf[Int]
}
我确信有更好的解决方案,这就是您可以提供帮助的地方:)
我特别不喜欢这里的一件事是 MyConfig 定义了一个带有一些任意键的中间容器,因为它是 Map[String, 任意 ],我需要转换值。
最佳答案
没有什么可以阻止您将值抽象化。您不能在 super 特征中强制执行惰性,但这没关系,因为无论如何延迟加载实际上是一个实现细节:
trait Config {
val param1: String
val param2: String
val param3: Int
}
class MyConfig extends Config {
lazy val param1 = readConfig().("p1")
...
def readConfig(): Map[String, String] = ...
}
在风格上,
readConfig()
应该用括号(而不是不带)声明和调用,因为它是一种副作用方法。无括号语法旨在表示纯函数方法。
关于scala - 延迟加载一些配置参数,试图在 Scala 中提出一个模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/345788/