Vorrei verificare gli argomenti del costruttore e rifiutare di costruire il lancio IllegalArgumentException
nel caso in cui gli argomenti impostati non siano validi (i valori non rientrano nei vincoli previsti). Come codificarlo in Scala?Come controllare gli argomenti del costruttore e lanciare un'eccezione o fare un'asserzione in un costruttore predefinito in Scala?
risposta
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.)
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
Nice! Che risposta perfetta alla domanda. Puoi elaborare un po '(o un link all'elaborazione) sui dettagli di come 'require' funziona? –
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
- 1. Come espongo gli argomenti del costruttore Scala come membri pubblici?
- 2. Gli argomenti del costruttore di Scala sono duplicati?
- 3. Argomenti costruttore costruttore ES6
- 4. Argomenti impliciti del costruttore
- 5. Passando tutti gli argomenti a un costruttore
- 6. Costruttore predefinito in C
- 7. Passando argomenti del costruttore in variabili d'istanza
- 8. In C++, è un costruttore con solo argomenti predefiniti un costruttore predefinito?
- 9. Scala: è possibile sovrascrivere il costruttore di case case predefinito?
- 10. Iniezione del costruttore con altri argomenti del costruttore, non dipendenti
- 11. Costruttore privato e protetto in Scala
- 12. Devo controllare i tipi di argomenti del costruttore (e anche in altri posti)?
- 13. Come passare argomenti a un costruttore non predefinito?
- 14. Eredita argomenti del costruttore genitore
- 15. Come passare gli argomenti del costruttore usando Mockito
- 16. Come lanciare un'eccezione da un costruttore enum?
- 17. Scala costruttore astrazione
- 18. javascript troppi argomenti del costruttore
- 19. Come eliminare il costruttore predefinito?
- 20. costruttore o copia costruttore?
- 21. Parametri locali del costruttore della classe Scala
- 22. Costruttore predefinito dichiarato dall'utente + Inizializzatori in classe! = Costruttore fornito dall'utente?
- 23. Passare gli argomenti del costruttore quando si usa StructureMap
- 24. nuovo [] se il costruttore dell'elemento predefinito può lanciare?
- 25. Enum disassemblato con javap non mostra gli argomenti del costruttore
- 26. Spazio dei nomi Spring p per gli argomenti del costruttore?
- 27. istanziare l'oggetto con la riflessione utilizzando gli argomenti del costruttore
- 28. costruttore con un parametro predefinito
- 29. Moduli Dagger con argomenti del costruttore?
- 30. Come posso passare gli argomenti del costruttore quando registro un tipo in Unity?
+1 bella spiegazione –
non sapeva della modalità Incolla, +1 :) – wbarksdale
Significa che Scala è un'ottima lingua – Pooya