Why were the case classes without a parameter list deprecated?

后端 未结 2 638
甜味超标
甜味超标 2020-12-05 04:37

Why were the case classes without a parameter list deprecated from Scala? And why does compiler suggest to use () as parameter list instead?

EDI

相关标签:
2条回答
  • 2020-12-05 04:55

    Without parameters, every instance of the case class is indistinguishable and hence is essentially a constant. Use an object for that case.

    0 讨论(0)
  • 2020-12-05 04:59

    It is really easy to accidentally use a no-arg case class incorrectly as a pattern.

    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
    

    Instead of:

    scala> (new Foo: Any) match { case _: Foo => true; case _ => false } 
    res11: Boolean = true
    

    Or better:

    scala> case object Bar                                               
    defined module Bar
    
    scala> (Bar: Any) match { case Bar => true; case _ => false }        
    res12: Boolean = true
    

    UPDATE Hopefully the transcript below will demonstrate why an empty parameter list is preferred to the deprecated missing parameter list.

    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()
    

    A case object would usually still be preferred over an empty parameter list.

    0 讨论(0)
提交回复
热议问题