我的應用程序使用屬性文件來加載多個屬性。將相關字段封裝到伴隨對象/類中並避免重複
應用程序的每個實例都有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