2017-11-06 5 views
0

私はケースクラスを持っている:私は「値」パラメータではなく文字列のクラスオブジェクトすることができ、新しいユースケースを持ってまで、Scalaのトレイトを実装

case class EvaluateAddress(addressFormat: String, 
          screeningAddressType: String, 
          value: Option[String]) { 
} 

これは罰金働いていました。

このユースケース処理するための私の最初の実装:

case class EvaluateAddress(addressFormat: String, 
          screeningAddressType: String, 
          addressId: Option[String], 
          addressValue: Option[MailingAddress]) { 

    @JsonProperty("value") 
    def setAddressId(addressId: String): Unit = { 
    val this.`addressId` = Option(addressId) 
    } 

    def this(addressFormat: String, screeningAddressType: String, addressId: String) = { 
    this(addressFormat, screeningAddressType, Option(addressId), None) 
    } 

    def this(addressFormat: String, screeningAddressType: String, address: MailingAddress) = { 
    this(addressFormat, screeningAddressType, None, Option(address)) 
    } 
} 

をしかし、私は、これは良い方法であると感じていないし、それが将来的にいくつかの問題を作成することがあります。

私は同じことを達成するためのさまざまな方法は何ですか?

編集:** addressFormat、screeningAddressType、value **の3つのパラメータを含むクラスを作成し、両方のユースケースを処理する方法はありますか?

答えて

3

ケースクラスのフィールドには、デフォルト値を設定できます。

ですから、Noneにオプションのフィールドのデフォルトを持つことができます。

case class EvaluateAddress(addressFormat: String, 
          screeningAddressType: String, 
          addressId: Option[String] = None, 
          addressValue: Option[MailingAddress] = None) 

を次にあなたがEvaluateAddressの新しいインスタンスを作成するとき、あなたはaddressId、またはaddressValueまたはその両方のいずれかの値を渡すために選択することができます。..何もない。

3

ここでは補助的なコンストラクタを指定する必要はありません。あなたは単純にケースクラスによって提供されるコピーメソッドを使うことができます。例えば

case class MailingAddress(email:String) 
case class EvaluateAddress(addressFormat: String, 
          screeningAddressType: String, 
          addressId: Option[String], 
          addressValue: Option[MailingAddress]) 

scala> val y = EvaluateAddress("abc", "abc", None, None) 
y: EvaluateAddress = EvaluateAddress(abc,abc,None,None) 

scala> y.copy(addressId = Some("addressId")) 
res0: EvaluateAddress = EvaluateAddress(abc,abc,Some(addressId),None) 
関連する問題