Я пишу конструктор для моего "основного" класса. Первое, что он делает, это вызывает метод, который использует commons-cli для разбора командной строки. Если метод parseOptions
возвращает false, произошла ошибка, и конструктор должен завершиться.
Я попытался написать следующий код
if (!parseOptions(args)) return
, но компилятор жалуется, что у меня есть «оператор Return вне определения метода» ".
Коротко о вызове Система. из конструктора?
Полагаю, у меня может быть метод parseOptions
, создающий исключение IllegalArgumentException
и перехватывающий это в моем объекте Main
.
Спасибо.
есть ли способ вернуть "раньше" из конструктора
Нет. Но в вашем случае это все равно звучит как плохой дизайн.
Если метод parseOptions возвращает false, произошла ошибка
В этом случае конструктор должен выдать исключение, а не возвращать его как обычно.
Не пытайтесь сделать ранний/преждевременный возврат, это сделает ваш код более сложным, так как побочные эффекты возврата могут быть трудны для понимания. Вместо этого используйте исключение, чтобы сигнализировать о том, что что-то не так.
Вы можете использовать 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)
Конструктор всегда должен либо завершиться полностью, либо прерваться (вызвать исключение ). Все остальное оставляет ваш объект «наполовину сконструированным», и поэтому о нем невозможно рассуждать.
Если в вашем случае объект действителен даже в случае сбоя parseOptions, вы можете изменить условие и продолжить:
if (parseOptions(args)) {
// rest of constructor
}