比方说,我在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()
?一个人比其他人有什么优势吗?
Tiger
,则应为对象。如果可以有多个相等的Tiger
,则应为一个类。val tiger = Tiger()
val tiger1 = Tiger()
tiger == tiger1 // true
tiger eq tiger1 // false
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
希望这会有所帮助!