1
を持っている「スマートコンストラクタ」とPerson
クラスを考えると、すなわちPerson#build
で唯一の「有効」値はPerson
を構築します読み込み:の定義は、[X] Xは、プライベートコンストラクタ
case class Person private(age: Int)
object Person {
def build(age: Int): Option[Person] =
if (age >= 0 && age <= 125) Some(Person(age)) else None
}
私は入れてReads[Person]
を作成しましたPerson
のコンパニオンオブジェクトへのそれ:
import play.api.libs.json._
import play.api.libs.functional.syntax._
implicit val reads: Reads[Person] =
(__ \ 'age).read[Int].map(a =>
Person.build(a).getOrElse(throw new RuntimeException("invalid age")
)
は、より良い方法はありますか?可能であれば例外を避けることを好むだろう。あなたがプレイ機能的なスタイルを落とすために喜んでいる場合
なぜあなたはPersonクラス(age:Int){require(age> = 0 && age <= 125、 "invalid age")}を使用しませんか? – Simon
例外を回避する、つまり例外を超えてMonadsを使用する –
コンパニオンオブジェクトでの読み取りの定義はどうでしょうか? – pedrofurla