2012-02-07 12 views

risposta

75

In Scala, l'intero corpo della classe è il costruttore principale, quindi è possibile aggiungere la logica di convalida lì.

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 fornisce un metodo di utilità require che permette di scrivere la stessa cosa in modo più conciso come segue:

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

Un approccio migliore potrebbe essere quello di fornire un metodo factory che dà un scalaz.Validation[String, Foo] invece di lanciare un eccezione. (Nota: richiede 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 bella spiegazione –

+4

non sapeva della modalità Incolla, +1 :) – wbarksdale

+0

Significa che Scala è un'ottima lingua – Pooya

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

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

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

Nice! Che risposta perfetta alla domanda. Puoi elaborare un po '(o un link all'elaborazione) sui dettagli di come 'require' funziona? –

+1

Ecco come funziona 'require', @ dan-burton ;-) http://pastebin.com/rJQfTCX9 Getta solo' nuovo IllegalArgumentException ("requisito fallito") 'se l'argomento è falso. L'idea di usare 'require' invece di limitarsi a lanciare l'eccezione è rendere il codice più carino e adatto all'analisi statica (che sembra non essere ancora implementato). – Ivan

Problemi correlati