Раннее возвращение из конструктора Scala

Я пишу конструктор для моего "основного" класса. Первое, что он делает, это вызывает метод, который использует commons-cli для разбора командной строки. Если метод parseOptions возвращает false, произошла ошибка, и конструктор должен завершиться.

Я попытался написать следующий код

if (!parseOptions(args)) return

, но компилятор жалуется, что у меня есть «оператор Return вне определения метода» ".

Коротко о вызове Система. из конструктора?

Полагаю, у меня может быть метод parseOptions , создающий исключение IllegalArgumentException и перехватывающий это в моем объекте Main .

Спасибо.

6
задан Ralph 23 August 2010 в 12:39
поделиться

3 ответа

есть ли способ вернуть "раньше" из конструктора

Нет. Но в вашем случае это все равно звучит как плохой дизайн.

Если метод parseOptions возвращает false, произошла ошибка

В этом случае конструктор должен выдать исключение, а не возвращать его как обычно.

11
ответ дан 8 December 2019 в 03:51
поделиться

Не пытайтесь сделать ранний/преждевременный возврат, это сделает ваш код более сложным, так как побочные эффекты возврата могут быть трудны для понимания. Вместо этого используйте исключение, чтобы сигнализировать о том, что что-то не так.

Вы можете использовать require в конструкторе. Это не приводит к возврату. Но кажется, что выброс исключения лучше подходит к ситуации.

Как в:

class MyTest(
private var myValue: Int ){

    require(myValue > 0) // Connected to constructor

}

defined class MyTest

scala> val x = new  MyTest(10)
x: MyTest = MyTest@49ff4282

scala> val y = new MyTest(-10)
java.lang.IllegalArgumentException: requirement failed
        at scala.Predef$.require(Predef.scala:133)
12
ответ дан 8 December 2019 в 03:51
поделиться

Конструктор всегда должен либо завершиться полностью, либо прерваться (вызвать исключение ). Все остальное оставляет ваш объект «наполовину сконструированным», и поэтому о нем невозможно рассуждать.

Если в вашем случае объект действителен даже в случае сбоя parseOptions, вы можете изменить условие и продолжить:

if (parseOptions(args)) {
  // rest of constructor
}
4
ответ дан 8 December 2019 в 03:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: