2012-02-07 22 views

Respuesta

75

En Scala, todo el cuerpo de la clase es su constructor principal, por lo que puede agregar allí su lógica de validación.

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 = [email protected] 

scala> new Foo(-3) 
java.lang.IllegalArgumentException: the number must be positive. 

Scala proporciona un método de utilidad require que le permite escribir lo mismo de manera más concisa de la siguiente manera:

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

Un mejor enfoque podría ser la de proporcionar un método de fábrica que da una scalaz.Validation[String, Foo] lugar de lanzar una excepción. (Nota: requiere 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.String,Foo] = Success([email protected]) 

scala> Foo(-3) 
res109: scalaz.Validation[java.lang.String,Foo] = Failure(number must be non-negative.) 
+2

+1 buena explicación –

+4

no sabía sobre el modo de pegar, +1 :) – wbarksdale

+0

Significa que Scala es un gran lenguaje – Pooya

15
scala> class Foo(arg: Int) { 
    | require (arg == 0) 
    | } 
defined class Foo 

scala> new Foo(0) 
res24: Foo = [email protected] 

scala> new Foo(1) 
java.lang.IllegalArgumentException: requirement failed 
+1

¡Bonito! Qué respuesta perfecta a la pregunta. ¿Puedes elaborar un poco (o un enlace a la elaboración) sobre los detalles de cómo funciona 'require'? –

+1

Así es como funciona 'require', @ dan-burton ;-) http://pastebin.com/rJQfTCX9 Simplemente arroja' nueva IllegalArgumentException ("requirement failed") 'si el argumento es falso. La idea de usar 'require' en lugar de arrojar la excepción ustedes mismos es hacer que su código sea más bonito y más adecuado para el análisis estático (que parece no haberse implementado todavía). – Ivan

Cuestiones relacionadas