我使用非常方便的 Scala 对象结构来捕获我的设置,如下所示
object Settings {
object ObjectSever {
val URL = "http://localhost:8081"
val timeout = 20
}
object ConnectionPools {
object Limits {
val timeout = 10
val max = 5
val prefix = "pref_"
}
}
}
但是,我需要拥有以下结构的多个实例,用于测试、不同的配置提供程序等。
所以我尝试用这样的结构构建一个抽象类,但是失败了。
我可以轻松地用抽象类
替换Settings
,但是如何重现如此漂亮的嵌套结构呢?
我还想保持编译类型的安全性 - 当我错过子类等中的某些元素时会出现错误。
最佳答案
我认为这里不需要抽象类,因为您似乎只想要一个不可变的数据结构,而没有任何实际的继承。嵌套案例类应该做得很好。
case class Settings(server: ObjectServer, connectionPools: ConnectionPools)
case class ObjectServer(URL: String, timeout: Int)
case class ConnectionPools(limits: Limits)
case class Limits(timeout: Int, max: Int, prefix: String)
val settings = Settings(
ObjectServer(
URL = "http://localhost:8081",
timeout = 20
),
ConnectionPools(
Limits(
timeout = 10,
max = 5,
prefix = "pref_"
)
)
)
无论如何,这是一种使用抽象类和这些类的匿名实例化的方法:
abstract class Settings {
val server: ObjectServer
val connectionPools: ConnectionPools
}
abstract class ObjectServer {
val URL: String
val timeout: Int
}
abstract class ConnectionPools {
val limits: Limits
}
abstract class Limits {
val timeout: Int
val max: Int
val prefix: String
}
object MySettings extends Settings {
val server = new ObjectServer {
val URL = "http://localhost:8081"
val timeout = 20
}
val connectionPools = new ConnectionPools {
val limits = new Limits {
val timeout = 10
val max = 5
val prefix = "pref_"
}
}
}
关于Scala "multilevel"抽象类/抽象对象替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27690763/