Me gustaría verificar los argumentos del constructor y rechazar construir throwing IllegalArgumentException
en caso de que los argumentos establecidos no sean válidos (los valores no se ajustan a las restricciones esperadas). ¿Cómo codificar esto en Scala?¿Cómo verificar los argumentos del constructor y arrojar una excepción o hacer una aserción en un constructor predeterminado en Scala?
Respuesta
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.)
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
¡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'? –
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
- 1. ¿Los argumentos del constructor Scala están duplicados?
- 2. ¿Por qué arrojar una excepción en los resultados del constructor en una referencia nula?
- 3. Copy Constructor y constructor predeterminado
- 4. Campos paramétricos de Scala y argumentos del constructor
- 5. En C++, ¿es un constructor con solo argumentos predeterminados un constructor predeterminado?
- 6. pasar todos los argumentos a un constructor
- 7. Scala abstracción constructor
- 8. Constructor vacío o sin constructor
- 9. Usando Java Reflection, ¿cómo obtener el constructor de una clase especificando una clase derivada de los argumentos del constructor?
- 10. Constructor Python y valor predeterminado
- 11. ¿Los argumentos de constructor obtienen GC'ed?
- 12. excepción manejo de un constructor
- 13. ¿Debo verificar los tipos de argumentos de constructor (y en otros lugares también)?
- 14. Scala constructor
- 15. ¿Cómo funciona RAII cuando un constructor lanza una excepción?
- 16. ¿Cómo eliminar el constructor predeterminado?
- 17. Impedir el uso del constructor predeterminado
- 18. Prácticas de Python: ¿hay una mejor manera de verificar los parámetros del constructor?
- 19. En Scala, ¿cómo le daría un Singleton a un constructor?
- 20. Constructor predeterminado y herencia virtual
- 21. constructor predeterminado de una clase heredada
- 22. ¿Cómo declaras un alias de tipo en un constructor scala?
- 23. ¿Cómo puedo definir condicionalmente el constructor predeterminado?
- 24. ¿Cómo expongo los argumentos del constructor de Scala como miembros públicos?
- 25. IoC, fábricas y argumentos de constructor
- 26. XmlSerializer constructor XmlTypeMapping y XmlRootAttribute argumentos
- 27. Excepción en el constructor estático
- 28. Genéricos Constructor predeterminado Java
- 29. Cómo pasar argumentos a un constructor en un IOC-framework
- 30. Cómo lanzar una excepción desde un constructor enum?
+1 buena explicación –
no sabía sobre el modo de pegar, +1 :) – wbarksdale
Significa que Scala es un gran lenguaje – Pooya