2010-08-23 101 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