2010-08-23 97 views
6

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

我试着写了下面的代码

if (!parseOptions(args)) return 

但是编译器会抱怨,我有一个“Return语句之外的方法定义”。

短调用System.exit(1)或反转布尔(并把我所有的if语句中逻辑的其余部分的,有没有办法从一个构造函数返回“早”?

我想我可以有parseOptions方法抛出IllegalArgumentException,赶上,在我Main对象。

感谢。

+1

虽然我与其他答案同意,没有构造函数通常应该返回,如果它无法为了使实例处于满足类不变量的状态,我想知道为什么你不愿意使用'if'? – 2010-08-23 15:05:10

+0

如果我有几个条件都可以导致提前回报,那么最终我会得到一个很深层次的“if”级联。 – Ralph 2010-08-23 16:21:49

+0

那么?如果这是你的构造函数的逻辑,那就是你的构造函数的逻辑。一般建议*不要*在构造函数中有很多复杂的逻辑。理想情况下,他们只是“记下”构成实例状态/值的值。 – 2010-08-23 20:39:47

回答

11

有没有办法从构造

号返回“早”,但在你的情况下,它听起来像不好的设计,反正。

如果parseOptions方法返回false,发生

错误在这种情况下,构造函数应该抛出一个异常,不能正常返回。

+0

重新思考(并使用'IllegalArgumentException'实现它)后,我同意一个错误的命令行解析值得一个例外。 – Ralph 2010-08-23 13:28:25

12

不要尝试做一个早/提前返回,这使你的代码更难更复杂,因为返回的副作用,可H理解。相反,请使用例外来指示出现问题。

您可以在构造函数中使用require。这不会返回。但似乎抛出一个异常实际上更符合他的情况。

如:

class MyTest(
private var myValue: Int){ 

    require(myValue > 0) // Connected to constructor 

} 

defined class MyTest 

scala> val x = new MyTest(10) 
x: MyTest = [email protected] 

scala> val y = new MyTest(-10) 
java.lang.IllegalArgumentException: requirement failed 
     at scala.Predef$.require(Predef.scala:133) 
+3

这不_return_。但似乎抛出一个异常实际上更符合他的情况。 – 2010-08-23 13:07:45

4

构造函数应该总是完全完成或中止(抛出异常)。其他任何事情都会让你的对象“一半构建”,因此无法推理。

如果你的情况,对象是有效的,即使parseOptions失败了,那么你就可以改变的条件并继续:

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

Scala不支持从构造函数返回的事实并不意味着它不可能推理。 用'if(!x){...}'替换'if(X)return; ...',你可以根据需要进行推理。 – 2010-08-23 15:12:43

+0

咦?你没有看到,扭转'如果'正是我所说的?我所说的构造函数应该抛出异常来完成或回滚。它不能让事情撤回。 – IttayD 2010-08-23 20:19:06