案例对象T与案例类T()在定义ADT时的区别?

问题描述 投票:1回答:2

比方说,我在Scala中具有如下ADT:

sealed trait Animal

object Animal {
case class Lion(name: String)    extends Animal
case class Elephant(name:String) extends Animal
case object Tiger                extends Animal
}

[这里,最好将Tiger声明为case对象,还是应该将其声明为空case类,即case class Tiger()?一个人比其他人有什么优势吗?

scala singleton algebraic-data-types
2个回答
3
投票
如果只有Tiger,则应为对象。如果可以有多个相等的Tiger,则应为一个类。

val tiger = Tiger() val tiger1 = Tiger() tiger == tiger1 // true tiger eq tiger1 // false


0
投票
[我的两分钱:我想如果您想在情况下像case class一样声明空的Tiger,请停下来思考,因为您很可能在做错事。

案例类的设计目的是易于使用结构化数据-但是,如果案例类中没有声明任何数据,则不清楚如何从业务逻辑的角度解释它们。另一方面-case object清楚地描述了某种信号类型,由于它是单例信号,因此不需要任何其他数据。

我会举一个实际的例子:

/** * Sum type describing abstract operation over some user profile in theoretical social network */ sealed trait UserProfileOperation /** * User requests edit certain field with value in it's profile */ case class Edit(field: String, value: String) extends UserProfileOperation /** * User requests to delete own profile - no additional data required, * so it is always singleton type signal */ case object Delete extends UserProfileOperation

希望这会有所帮助!
© www.soinside.com 2019 - 2024. All rights reserved.