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?
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 inRational
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:
Das funktioniert zumindest, auch wenn es etwas kompliziert ist.
%Vor%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:
Tags und Links scala