2013-04-03 91 views
0

我的应用程序使用属性文件来加载多个属性。将相关字段封装到伴随对象/类中并避免重复

应用程序的每个实例都有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
现在感觉像tokenliveurlPrefix值应该住在一起(如应为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

回答

2

可以初始化同时这样既tokenurlPrefix

val (token, urlPrefix) = flag match { 
    case "live" => ("L", "") 
    case "staging" => ("S", "staging-") 
    case "test" => ("T", "test-") 
} 
+0

是的!我很努力地从成对创建案例对象(比如:Discriminator(flag match {.. =>(“L”,“')..}),当我实际上我根本不需要任何显式对象。谢谢! – teo

1

为什么不替换此:

val token = flag match { 
     case "live" => "L" 
     .... 
    val urlPrefix = flag match { 
     case "live" => "" 
     ..... 

的东西返回一个元组?例如

val tokens = flag match { 
     case "live" => ("L", "")