Warum können Hilfskonstruktoren in Scala nur aus einem Aufruf eines anderen Konstruktors bestehen?

9

Ich denke, ich sehe den Vorteil darin, Hilfskonstruktoren so zu definieren, dass der primäre Konstruktor der einzige Einstiegspunkt in die Klasse ist. Aber warum kann ich so etwas nicht machen?

%Vor%

Ist es vielleicht ein Weg, um zu garantieren, dass der Hilfskonstruktor keine Nebenwirkungen hat und / oder nicht vorzeitig zurückkehren kann?

    
Phil Darnowsky 08.01.2013, 03:58
quelle

1 Antwort

16

Hilfskonstruktoren können mehr als einen Aufruf eines anderen Konstruktors enthalten, aber ihre erste Anweisung muss der Aufruf sein.

Wie in Programmierung in Scala erklärt, ch. 6.7:

  

In Scala muss jeder Hilfskonstruktor einen anderen Konstruktor von aufrufen   die gleiche Klasse wie die erste Aktion. Mit anderen Worten, die erste Aussage in jedem   Hilfskonstruktor in jeder Scala-Klasse hat die Form this(. . . ) .   Der aufgerufene Konstruktor ist entweder der primäre Konstruktor (wie in Rational   Beispiel) oder einen anderen Hilfskonstruktor, der vor dem Text erscheint   Aufrufender Konstruktor. Der Nettoeffekt dieser Regel ist jeder Konstruktoraufruf   in Scala wird schließlich den primären Konstruktor der aufrufen   Klasse. Der primäre Konstruktor ist somit der einzige Einstiegspunkt einer Klasse.

     

Wenn Sie mit Java vertraut sind, fragen Sie sich vielleicht, warum Scala Regeln für   Konstruktoren sind ein wenig restriktiver als Java. In Java ein Konstruktor   muss entweder einen anderen Konstruktor derselben Klasse aufrufen oder direkt aufrufen   ein Konstruktor der Superklasse, als seine erste Aktion. In einer Scala-Klasse, nur die   Primärer Konstruktor kann einen Superklassenkonstruktor aufrufen. Das erhöht   Einschränkung in Scala ist wirklich ein Design-Trade-off, das eingezahlt werden musste   Austausch für die größere Prägnanz und Einfachheit der Konstrukteure von Scala   im Vergleich zu Java.

Genau wie in Java kann man diese Einschränkung umgehen, indem man den vor dem Aufruf des primären Konstruktors auszuführenden Code in eine separate Methode extrahiert. In Scala ist es ein wenig komplizierter als in Java, da Sie diese Hilfsmethode offenbar in das Companion-Objekt verschieben müssen, um es vom Konstruktor aus aufrufen zu können.

Außerdem ist Ihr spezifischer Fall umständlich, da Sie zwei Konstruktorparameter haben und - obwohl Tupel von einer Funktion zurückgegeben werden können - dieses zurückgegebene Tupel nicht als Argumentliste für den primären Konstruktor akzeptiert wird. Für normale Funktionen können Sie tupled verwenden, aber ach, das scheint nicht für Konstrukteure zu funktionieren. Eine Abhilfe wäre, einen weiteren Hilfskonstruktor hinzuzufügen:

%Vor%

Das funktioniert zumindest, auch wenn es etwas kompliziert ist.

%Vor%

Aktualisieren

Wie @schaef in seinem Kommentar gezeigt hat, kann dies mit einer Factory-Methode im Companion-Objekt vereinfacht werden:

%Vor%

Somit brauchen wir kein new , um ein Objekt mehr zu erzeugen:

%Vor%     
Péter Török 08.01.2013, 08:25
quelle

Tags und Links