2017-09-15 1 views
4

Wenn ich kompilieren diese:Warum ist `return` im Kotlin init block nicht erlaubt?

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

Ich erhalte eine Fehlermeldung:

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

Ich will nicht mit dem Compiler argumentieren, aber ich bin neugierig auf die Motivation hinter dieser Einschränkung.

Antwort

8

Dies wird wegen der möglichen Gegen intuitive Verhalten im Hinblick auf mehrere init { ... } Blöcke nicht erlaubt, die auf subtile Bugs führen könnte:

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

Wenn die Antwort ‚Nein‘ ist, wird der Code spröde: Hinzufügen eines return in einem init Block würde die anderen Blöcke beeinflussen.

Eine mögliche Abhilfe, die Sie einen einzelnen init Block zu beenden erlaubt ist eine Funktion, mit Lambda und a labeled return zu verwenden:

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

oder verwenden Sie eine explizit definiert secondary constructor:

class C { 
    constructor() { 
     if (someCondition) return 
     /* do something otherwise */ 
    } 
} 
Verwandte Themen