Подтвердить что ты не робот

Как проверить аргументы конструктора и выдать исключение или сделать утверждение в конструкторе по умолчанию в Scala?

Я хотел бы проверить аргументы конструктора и отказаться от конструкции throwing IllegalArgumentException в случае, если установленные аргументы недопустимы (значения не соответствуют ожидаемым ограничениям). Как закодировать это в Scala?

4b9b3361

Ответ 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