2017-09-15 11 views
4

私はこのコンパイルする場合:Kotlinのinitブロックで `return`が使えないのはなぜですか?

class CsvFile(pathToFile : String) 
{ 
    init 
    { 
     if (!File(pathToFile).exists()) 
      return 
     // Do something useful here 
    } 
} 

を私はエラーを取得:

Error:(18, 13) Kotlin: 'return' is not allowed here

私はコンパイラと議論する必要はありませんが、私は、この制限の背後にある動機について興味があります。

答えて

8

これが原因で微妙なバグにつながる可能性があるいくつかのinit { ... }ブロックに関して可能直感に反する行動を許可されていません。答えは「いいえ」、コードが脆くなっている場合

class C { 
    init { 
     if (someCondition) return 
    } 
    init { 
     // should this block run if the previous one returned? 
    } 
} 

: 1つのブロック内にreturnを追加すると、他のブロックに影響します。

あなたは、単一のinitブロックは、ラムダとa labeled returnでいくつかの機能を使用することです完了することができます回避策:

class C { 
    init { 
     run { 
      if (someCondition) [email protected] 
      /* do something otherwise */ 
     } 
    } 
} 

または明示的にsecondary constructorを定義して使用します。

class C { 
    constructor() { 
     if (someCondition) return 
     /* do something otherwise */ 
    } 
} 
関連する問題