我的应用程序使用属性文件来加载多个属性。将相关字段封装到伴随对象/类中并避免重复
应用程序的每个实例都有3个与环境有关的参数 - 其中一个是属性,另外两个是基于它的计算。
class Environment(val properties: Properties) {
val dbUrl = valueOrError("db.url")
val host = valueOrError("host")
//...
val environmentFlag = valueOrError("env.flag")
val environmentToken = environmentFlag match {
case "live" => "L"
case "staging" => "S"
case "test" => "T"
val environmentUrlPrefix = environmentFlag match {
case "live" => ""
case "staging" => "staging-"
case "test" => "test"
}
}
在我看来,3环境*属性应该以某种方式封装。
我称为寻求的抽象Discriminator
,因为它用于区分3(现在)的环境类型。因为在一个运行的应用程序,只有一组这样的环境中*属性,我实现它作为一个object
:
class Environment(val properties: Properties) {
val dbUrl ...
object Discriminator {
val flag = valueOrError("env.flag")
val token = flag match {
case "live" => "L"
case "staging" => "S"
case "test" => "T"
val urlPrefix = flag match {
case "live" => ""
case "staging"=> "staging-"
case "test" => "test-"
}
}
}
我可以打电话:environment.Discriminator.urlPrefix
,这是很好的,但我怎么能提高代码?我如何摆脱重复的match
?
现在感觉像token
和live
urlPrefix
值应该住在一起(如应为staging
等等的) - 有点像一个鉴别类的一个实例的一部分。
abstract class Discriminator(val flag = valueOrError("env.flag"),
val token: String
val urlPrefix: String)
因为我还是想用environment.Discriminator.urlPrefix
,我仍然需要Discriminator
(现在)的同伴对象。
但我卡在这里 - 我不知道如何结合概念。
我明显要创建自己的3个Discriminator实例 - 基于具体的flag
字段,但是如何?我如何调用构造函数 - 根据第一个参数传递最后两个参数(这对所有实例通用)?
一旦我有了这个,我如何连接三个实例与Discriminator伴侣对象,以便我可以使用environment.Discriminator.urlPrefix
?
是的!我很努力地从成对创建案例对象(比如:Discriminator(flag match {.. =>(“L”,“')..}),当我实际上我根本不需要任何显式对象。谢谢! – teo