Groovy: Konstruktoren

Aus Wikibooks

Für Konstruktoren gelten dieselben syntaktischen Aufbesserungen wie für normale Methoden, Sie können also Vorgabewerte, variable Parameterlisten, benannte Parameter und den Spread-Operator in derselben Weise anwenden. Darüber hinaus gibt es noch zwei weitere Möglichkeiten: Benannte Argumente zur Initialisierung von Properties und Argumentlisten.

Property-Intitialisierung durch benannte Argumente[Bearbeiten]

Bei Konstruktoren können Sie noch eine zweite Form von benannten Parametern anwenden. Sie kommt allerdings nur dann zum Tragen, wenn in der Klasse ein argumentloser Standardkonstruktor vorhanden ist und kein Konstruktor mit einer Map als Parameter vorhanden ist. In diesem Fall ruft Groovy den Standardkonstruktor auf und setzt anschließend die als benannte Argumente angegebenen Properties. Das bedeutet, dass es zu jedem benannten Argument eine gleichnamige Property in der Klasse geben muss.

Erinnern Sie sich an unsere weiter oben als Beispiel für den Umgang mit Properties eingeführte Klasse KalenderDatum.

 class KalenderDatum {
   Calendar calendar = new GregorianCalendar(0,0,0,0,0,0)
   KalenderDatum(dayOfMonth,month,year) {
     this.dayOfMonth = dayOfMonth
     this.month = month
     this.year = year
   }
 ...
 }

Wir sehen, dass wir den Konstruktor eigentlich gar nicht bräuchten; wir können ihn aber auch stehen lassen, da er nicht weiter stört und für ein schnelles Instanziieren ganz handlich sein kann. Vorausgesetzt, wir fügen noch einen Standardkonstruktor hinzu, können wir die Klasse auch so instanziieren:

 groovy> maifeiertag = new KalenderDatum(year:2007,month:5,dayOfMonth:1)
 groovy> println maifeiertag
 1.4.2007

Damit ersparen wir uns das getrennte Instanziieren der Klasse und anschließende einzelne Setzen von Properties, wie es insbesondere beim Umgang mit Beans häufig erforderlich ist, und wie es auch bei diesem typischen Ausschnitt aus einem Swing-Programm zu sehen ist:

 // Java
 JButton startButton = new JButton("Start");
 startButton.setMnemonic('S');
 startButton.setEnabled(false);
 startButton.setAction(buttonAction);
 buttonPanel.add(startButton);

In Groovy sieht das aufgrund des praktischen Konstruktor-Aufrufs viel übersichtlicher aus:

 buttonPanel.add(new Button(
        text:"Start",
        mnemonic:'S',
        enabled:false,
        action:buttonAction))

Instanziieren mit Listen[Bearbeiten]

Wie erwähnt, können Sie auch in Konstruktoren den Spread-Operator (*MeineListe) anwenden und damit mehrere Argumente auf einen Schlag als Liste oder Array übergeben. Noch weiter gehend ist aber die Möglichkeit, Listen direkt als Konstruktoren von Objekten zu benutzen.

Als Beispiel kommt der Konstruktor mit den Positionsparametern in unserem KalenderDatum noch einmal zu Ehren.

 groovy> tag = [1,1,2008]
 groovy> KalenderDatum neujahr = tag
 groovy> println neujahr
 1.1.2008

Wenn Sie versuchen, einer typisierten Variablen, die nicht mit List kompatibel ist, eine Liste zuzuweisen, wendet Groovy einen seiner Mechanismen zur Typanpassung an. Es sucht nach einem Konstruktor, dessen Parameterliste genau zu den Elementen des übergebenen List-Objekts passt, und ruft ihn mit den Werten der Liste als Parameter auf. Das funktioniert natürlich nur, wenn die Zielvariable typisiert ist, denn irgendwoher muss Groovy wissen, an welcher Klasse der Konstruktor überhaupt zu suchen ist. Alternativ können Sie aber auch mit dem Schlüsselwort as die Typanpassung erzwingen, dann kann die Zielvariable auch untypisiert sein.

 groovy> def neujahr = tag as KalenderDatum