早期从Scala构造函数返回

时间:2010-08-23 12:39:43

标签: scala constructor exit

我正在为“main”类编写构造函数。它做的第一件事是调用一个方法来使用commons-cli来解析命令行。如果parseOptions方法返回false,则发生错误,构造函数应退出。

我尝试编写以下代码

if (!parseOptions(args)) return

但是编译器抱怨我有一个“在方法定义之外的返回语句”。

没有调用System.exit(1)或反转布尔值(并将我的所有其余逻辑放在if语句中,有没有办法从构造函数返回“早期”?

我想我可以让parseOptions方法抛出IllegalArgumentException并在我的Main对象中捕获它。

感谢。

3 个答案:

答案 0 :(得分:12)

不要尝试早期/早期返回,这会使您的代码更加复杂,因为返回的副作用很难理解。而是使用异常来表示出现问题。

您可以在构造函数中使用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)

答案 1 :(得分:11)

  

有没有办法从构造函数

返回“早期”

没有。但是在你的情况下,无论如何它听起来都是糟糕的设计。

  

如果parseOptions方法返回false,则发生错误

在这种情况下,构造函数应抛出异常,而不是正常返回。

答案 2 :(得分:4)

构造函数应始终完全完成或中止(抛出异常)。任何其他东西都会使你的物体“半结构化”,因而无法推理。

如果在您的情况下,即使parseOptions失败,该对象也有效,那么您可以更改条件并继续:

if (parseOptions(args)) {
  // rest of constructor
}