Scala 定义ADT时case对象T和case类T()之间的差异?

Scala 定义ADT时case对象T和case类T()之间的差异?,scala,singleton,algebraic-data-types,Scala,Singleton,Algebraic Data Types,假设在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

假设在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
s,那么它应该是一个类

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

我的2美分:我想如果你想在你的案例中声明空的
case类
Tiger
,停下来想想,因为你很可能做错了什么

Case类的设计目的是便于处理结构化数据,但如果Case类中没有声明数据,则不清楚从业务逻辑的角度应该如何解释它。另一方面-
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 

希望这有帮助

值得一提的是,即使有多个tiger,如果它们都相等,那么仅仅使用case对象也没有什么区别,因为对case类使用
eq
几乎没有意义另外,最好补充一下,所有这些都应该是
final