Scala/IntelliJ: case object X vs case class X vs case class X()

Scala/IntelliJ: case object X vs case class X vs case class X()

Scala 中有 class 个案例:

case class X(one: One, two: two)

有些案例对象只有一个实例(这是有道理的):

case object X

当我声明一个没有参数的 case class 时,IntelliJ 做了正确的事情并弃用 - 警告我将它变成一个 case 对象:

case class X // deprecated stuff

但是它没有警告我

case class X()

这让我想知道 case class Xcase class X() 之间是否有区别?

我不知道你用的是什么 Scala 版本,但在 2.11 中这不仅被弃用而且确实是一个错误:

 Error:(34, 17) case classes without a parameter list are not allowed;
 use either case objects or case classes with an explicit `()' 
 as a parameter list.
   case class Foo
                 ^

简单地说,您不能针对无参数列表的情况进行模式匹配class,因此它们没有用处。

case class Foo()

def test(in: Any) = in match {
  case Foo() => "foo"
  case _     => "other"
}

当您声明一个案例对象时,只会创建一个实例。但是,您可以有多个不同的无参数案例实例 class。为什么你可能想要那是另一回事。

原则上case class Foocase class Foo()没有区别。我认为前者已被弃用,因为它很容易被无意中滥用。这 post 很好地说明了这一点。