2017-04-01 11 views
0

私は、私のservcie内のAPIから戻ってくるモデルクラスを持っています。そして、私はそれをクライアントに返すとき、私は自分のモデルを使ってクライアントをよりシンプルできれいに保ちたいと思っています。ケースクラス間で変換するためのスカラーの最適な方法は何でしょうか?

例:私は多分、私は感謝の知らないことを、それを行うための最善の慣行があると思ったので、

case class ReturnedModel(succeed: Option[String], reason: Reason, transactionId: List[Int], opId: Option[Int]) 

case class MyReturnedModel(reason: String) 

私は将来的にそれらの多くを行う必要があるかもしれません!ご使用のケースに応じて、

答えて

1

あなたは、メソッド「適用」カスタムでコンパニオンオブジェクトを使用することができます。

case class MyReturnedModel(reason: String) 

object MyReturnedModel { 
    def apply(mod: ReturnedModel) = MyReturnedModel(mod.reason.toString) 
} 

val data: ReturnedModel = ... // Some instance of ReturnedModel 
val mr = MyReturnModel(data) 

を念のクラスとそのコンパニオンオブジェクトは、仕事に、このため同じファイルにする必要があることに注意してください。

0

sealed trait IKnowAReason { def reason:String } 

case class ReturnedModel(succeed: Option[String], reason: Reason, 
    transactionId: List[Int], opId: Option[Int]) extends IKnowAReason 

IKnowAReasonMyReturnedModelの使用を交換してください。封印されていることに注意してください。同じソースファイルの外にIKnowAReasonの実装がないことを保証します。

0

ReturnedModelを変更するアクセス権がある場合は、@ pedrofurlaのような特徴を使用できます。

あなたがReturnedModelを変更することができない場合、あなたはこのようMyReturnedModelReturnedModelのすべてのインスタンスを変換するには、暗黙の関数を宣言できます。

implicit def returnedModelToMyModel(returnedModel: ReturnedModel): MyReturnedModel = { 

    // Have some logic to convert their model to your model 
    MyReturnedModel(returnedModel.reason.toString) 

} 

あなたはAPIからReturnedModelを取得するたびその後、あなたが使用することができますそれどこでもあなたがMyReturnedModelのインスタンスを期待している:それはタイプがあなたの時間と認めるときは

def doWork(myReturnedModel: MyReturnedModel) = { /* Logic that needs and instance of MyReturnedModel */ } 

// Grab an instance of ReturnModel from the API 
val returned: ReturnedModel = ??? 

// Will get converted when you need it to be an instance of MyReturnedModel 
doWork(returned) 

コンパイラが暗黙の型変換をプリフォームしようとします渡されたaveが正しくない場合、型変換を満たす暗黙的な変換が検索されます。

関連する問題