Comment vérifier les arguments du constructeur et lancer une exception ou faire une assertion dans un constructeur par défaut dans Scala?

Je voudrais vérifier les arguments du constructeur et refuser de construire une IllegalArgumentException lancer au cas où le jeu d’arguments n’est pas valide (les valeurs ne correspondent pas aux contraintes attendues). Comment coder cela dans Scala?

Dans Scala, le corps entier de la classe est votre constructeur principal, vous pouvez donc y append votre logique de validation.

 scala> class Foo(val i: Int) { | if(i < 0) | throw new IllegalArgumentException("the number must be non-negative.") | } defined class Foo scala> new Foo(3) res106: Foo = Foo@3bfdb2 scala> new Foo(-3) java.lang.IllegalArgumentException: the number must be positive. 

Scala fournit une méthode utilitaire qui vous permet d’écrire la même chose de manière plus concise, comme suit:

 class Foo(val i: Int) { require(i >= 0, "the number must be non-negative.") } 

Une meilleure approche pourrait être de fournir une méthode de fabrique qui donne un scalaz.Validation[Ssortingng, Foo] au lieu de lancer une exception. (Note: nécessite Scalaz)

 scala> :paste // Entering paste mode (ctrl-D to finish) class Foo private(val i: Int) object Foo { def apply(i: Int) = { if(i < 0) failure("number must be non-negative.") else success(new Foo(i)) } } // Exiting paste mode, now interpreting. defined class Foo defined module Foo scala> Foo(3) res108: scalaz.Validation[java.lang.Ssortingng,Foo] = Success(Foo@114b3d5) scala> Foo(-3) res109: scalaz.Validation[java.lang.Ssortingng,Foo] = Failure(number must be non-negative.) 
 scala> class Foo(arg: Int) { | require (arg == 0) | } defined class Foo scala> new Foo(0) res24: Foo = Foo@61ecb73c scala> new Foo(1) java.lang.IllegalArgumentException: requirement failed