给定A
,其可能包含可选字段a
和b
:
case class A(a: Option[Int], b: Option[String])
我可以将A
定义为Algebraic Data Type。
但是,每个None/Option
选项需要4个子类:
sealed trait AADT
case class Aa(a: Int) extends AADT
case class Aab(a: Int, b: String) extends AADT
case class Ab(b: String) extends AADT
case object Neither extends AADT
我认为此ADT优于上述A
选项,其中包含Option
种类型。
但是,这种类型很快就会失去3,4等字段。
是否有第三种实施A
的方法,即不使用我的第一次或第二次实施?
答案 0 :(得分:4)
代数上有第三个选项涵盖所有组合
sealed trait A
case class Ao(o: Option[(Int, String)]) extends A //all or none
case class Ae(e: Either[Int, String]) extends A //first or second
如果每个案例都有一个单独的域名,我肯定会选择某种ADT。
可选字段适用于数据传输对象(DTO)
答案 1 :(得分:0)
这是我想到的第一件事,在评论部分发布它几乎不可读。它绝对不是一个最漂亮的解决方案,但可能足够好'对于OP的案例。
ValueError: Could not unserialize key data.
只需使用正确的参数调用sealed trait AADT
case class Aa(a: Int) extends AADT
case class Aab(a: Int, b: String) extends AADT
case class Ab(b: String) extends AADT
case object Neither extends AADT
object AADTBuilder {
def apply() = Neither
def apply(a: Int) = Aa(a)
def apply(a: Int, b: String) = Aab(a, b)
def apply(b: String) = Ab(b)
}
。