41 votes

Pourquoi les classes de cas sans liste de paramètres sont-elles obsolètes?

Pourquoi les classes de cas sans liste de paramètres sont-elles déconseillées dans Scala? Et pourquoi le compilateur suggère-t-il plutôt d'utiliser () comme liste de paramètres?

MODIFIER :

Quelqu'un s'il vous plaît répondez à ma deuxième question ...: |

31voto

retronym Points 35066

Il est très facile d'utiliser accidentellement une classe de cas sans argument comme modèle.

 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
 

Au lieu de:

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

Ou mieux:

 scala> case object Bar                                               
defined module Bar

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

UPDATE Espérons que la transcription ci-dessous montre pourquoi une liste de paramètres vide est préférée à la liste de paramètres manquants et obsolète.

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

Un objet case sera toujours préféré à une liste de paramètres vide.

18voto

Randall Schulz Points 18820

Sans paramètres, chaque instance de la classe de cas est indiscernable et est donc essentiellement une constante. Utilisez un objet pour ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X