Es muy fácil utilizar accidentalmente una clase de caja sin arg como patrón.
scala> case class Foo
warning: there were deprecation warnings; re-run with -deprecation for details
defined class Foo
scala> (new Foo: Any) match { case Foo => true; case _ => false }
res10: Boolean = false
En lugar de:
scala> (new Foo: Any) match { case _: Foo => true; case _ => false }
res11: Boolean = true
O mejor:
scala> case object Bar
defined module Bar
scala> (Bar: Any) match { case Bar => true; case _ => false }
res12: Boolean = true
ACTUALIZACIÓN Esperamos que la transcripción a continuación demostrará por qué se prefiere una lista de parámetros vacía a la lista de parámetros que falta en desuso.
scala> case class Foo() // Using an empty parameter list rather than zero parameter lists.
defined class Foo
scala> Foo // Access the companion object Foo
res0: Foo.type = <function0>
scala> Foo() // Call Foo.apply() to construct an instance of class Foo
res1: Foo = Foo()
scala> case class Bar
warning: there were deprecation warnings; re-run with -deprecation for details
defined class Bar
scala> Bar // You may expect this to construct a new instance of class Bar, but instead
// it references the companion object Bar
res2: Bar.type = <function0>
scala> Bar() // This calls Bar.apply(), but is not symmetrical with the class definition.
res3: Bar = Bar()
scala> Bar.apply // Another way to call Bar.apply
res4: Bar = Bar()
Normalmente, se preferiría un objeto de caso sobre una lista de parámetros vacía.
En lugar de 'case _: Foo' puedes escribir' case Foo() '. – sepp2k
Todavía no lo entiendo. ¿Por qué esperaría que la construcción 'Bar' creara una nueva instancia de la clase' Bar'? – missingfaktor
** "Barra() // Llama a Bar.apply(), pero no es simétrico con la definición de la clase." ** - Este argumento se aplica también a las clases normales (no case). Entonces, ¿por qué el compilador no muestra una advertencia cuando defino una clase sin lista de parámetros? (por ejemplo, 'class Bar') – missingfaktor