2010-08-23 11 views
6

Ich schreibe den Konstruktor für meine "Haupt" -Klasse. Das erste, was es tut, ist eine Methode aufzurufen, Commons-CLI zu verwenden, um die Befehlszeile zu analysieren. Wenn die Methode parseOptions false zurückgibt, ist ein Fehler aufgetreten und der Konstruktor sollte beendet werden.Vorzeitige Rückkehr von einem Scala-Konstruktor

versuchte ich

if (!parseOptions(args)) return 

den folgenden Code schreiben, aber der Compiler beschwert sich, dass ich eine „Return-Anweisung außerhalb Methodendefinition“ haben.

Kurz von System.exit(1) oder Umkehren der boolean Aufruf (und der ganze Rest meiner Logik innerhalb der if Anweisung setzen, ist es eine Möglichkeit, zurückzukehren „früh“ von einem Konstruktor?

Ich glaube, ich das haben könnte parseOptions Methode ein IllegalArgumentException werfen und dieses Objekt in meinem Main fangen.

Dank.

+1

Während ich mit den anderen Antworten bestätigen, dass kein Konstruktor sollte in der Regel zurück, wenn es nicht in der Lage war, Um die Instanz in einen Zustand zu versetzen, der die Invarianten ihrer Klasse erfüllt, frage ich mich, warum Sie der Verwendung von "if" abgeneigt sind? –

+0

Wenn ich mehrere Bedingungen habe, die alle zu einer frühen Rückkehr führen können, werde ich mit einer "if" -Kaskade viele Ebenen tief enden. – Ralph

+0

Also? Wenn das die Logik Ihres Konstruktors ist, ist das die Logik Ihres Konstruktors. Es wird auch generell empfohlen, keine komplexe Logik in Ihren Konstruktoren zu haben. Im Idealfall "notieren" sie einfach die Werte, die den Zustand/Wert der Instanz umfassen. –

Antwort

11

ist es eine Möglichkeit, zurückzukehren "früh" von einem Konstruktor

Nein, aber in Ihrem Fall klingt es wie schlechtes Design, sowieso.

Wenn die ParseOptions Methode false zurückgibt, ist ein Fehler

In diesem Fall tritt der Konstruktor sollte eine Ausnahme auslösen, die normalerweise nicht zurück.

+0

Nach dem Umdenken (und der Implementierung mit 'IllegalArgumentException') stimme ich zu, dass eine fehlerhafte Befehlszeilenanalyse eine Ausnahme verdient. – Ralph

12

Dont versuchen, eine frühe/vorzeitige Rückkehr zu tun, das macht den Code schwerer komplexe, da die Nebenwirkungen der Rückkehr sein können h ard zu verstehen. Verwenden Sie stattdessen eine Ausnahme, um anzuzeigen, dass etwas nicht stimmt.

Sie können require im Konstruktor verwenden. Dies kommt nicht zurück. Aber es scheint, als ob das Werfen einer Ausnahme tatsächlich besser zu seiner Situation passt.

Wie in:

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

Dies wird nicht zurückgegeben. Aber es scheint, als ob das Werfen einer Ausnahme tatsächlich besser zu seiner Situation passt. –

4

Ein Konstruktor sollte immer entweder vollständig vervollständigen oder abbrechen (eine Ausnahme auslösen). Alles andere lässt dein Objekt "halb konstruiert" und somit unmöglich zu verstehen.

Wenn in Ihrem Fall das Objekt gültig ist, selbst wenn ParseOptions ausgefallen ist, dann können Sie den Zustand ändern und weiter:

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

Die Tatsache, dass Scala die Rückgabe vom Konstrukteur nicht unterstützt, bedeutet nicht, dass es unmöglich ist, darüber zu urteilen. Ersetze 'if (X) return; ...' mit 'if (! X) {...}' und du kannst so viel wie möglich nachdenken. –

+0

Huh? Hast du nicht gesehen, dass das "Wenn" umzukehren, genau das ist, was ich vorgeschlagen habe? Was ich gesagt habe, sollte ein Konstruktor beenden oder einen Rollback ausführen, indem er eine Ausnahme auslöst. Es kann nicht zurückkehren, Dinge lassen sich nicht rückgängig machen. – IttayD

Verwandte Themen