Я хотел бы проверить аргументы конструктора и отказаться от конструкции throwing IllegalArgumentException
в случае, если установленные аргументы недопустимы (значения не соответствуют ожидаемым ограничениям). Как закодировать это в Scala?
Как проверить аргументы конструктора и выдать исключение или сделать утверждение в конструкторе по умолчанию в Scala?
Ответ 1
В Scala весь элемент класса является вашим основным конструктором, поэтому вы можете добавить туда свою логику проверки.
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 предоставляет метод утилиты require
, который позволяет писать то же самое более кратко следующим образом:
class Foo(val i: Int) {
require(i >= 0, "the number must be non-negative.")
}
Лучшим подходом может быть предоставление метода factory, который дает scalaz.Validation[String, Foo]
вместо того, чтобы выбрасывать исключение. (Примечание: требуется 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
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