私のアプリケーションは、プロパティ ファイルを使用して複数のプロパティをロードします。
アプリケーションのすべてのインスタンスには、環境に関連する 3 つのパラメーターがあります。そのうちの 1 つはプロパティで、残りの 2 つはそれに基づいて計算されます。
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 つの (今のところ) 環境タイプを区別するために使用されるため、私はこの抽象化を seeked と呼びました。1 つの実行中のアプリケーションでは、そのような environment* プロパティのセットが 1 つしかないため、次のように実装しました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
ですか? これで、との値が一緒に存在する必要
があるように感じられます(for などの値と同様に) - Discriminator クラスの 1 つのインスタンスの一部のようなものです。token
urlPrefix
live
staging
abstract class Discriminator(val flag = valueOrError("env.flag"),
val token: String
val urlPrefix: String)
私はまだ を使いたいのでenvironment.Discriminator.urlPrefix
、Discriminator
(現在の) コンパニオン オブジェクトが必要です。
しかし、私はここで立ち往生しています - 概念を組み合わせる方法がわかりません。
flag
具体的なフィールドに基づいて、Discriminator の 3 つのインスタンスを自分で作成する必要があることは明らかですが、どうすればよいでしょうか。コンストラクターを呼び出すにはどうすればよいですか? 最初のパラメーターに基づいて最後の 2 つのパラメーターを渡します (これはすべてのインスタンスに共通です)。
これを取得したら、3 つのインスタンスを Discriminator コンパニオン オブジェクトに接続して、 を使用できるようにするにはどうすればよいenvironment.Discriminator.urlPrefix
でしょうか?