Groovy: Steroide einschalten

UPDATE: Dieser Beitrag wurde am 17. November 2016 erheblich aktualisiert, um fehlerhafte Aussagen und Beispiele zu korrigieren, das zugrunde liegende HTML-Layout zu korrigieren (für Leser nur dann offensichtlich, wenn Sie die HTML-Quelle in einem Webbrowser anzeigen) und einige Rechtschreibprobleme zu beheben. Wenn Sie aus irgendeinem Grund den alten, falschen Beitrag sehen möchten, lesen Sie die von der Wayback-Maschine archivierte Version.

Ich habe bereits über Groovys Unterstützung für das Einschalten von String gebloggt. Groovy kann viel mehr als nur Literale String(und Literal-Integraltypen, die Java einschalten lässt) einschalten, und ich demonstriere dies hier kurz.

Die switchAnweisung von Groovy verwendet eine Methode, die mit dem Namen " isCase" implementiert ist, um festzustellen, ob eine bestimmte switchOption übereinstimmt. Dies bedeutet, dass benutzerdefinierte Objekte in Groovy "umschaltbar" sind. Für das einfache Beispiel in diesem Blog-Beitrag verwende ich die Java-Klassen SimpleStateund State.java.

Listing 1. SimpleState.java

 package dustin.examples; import static java.lang.System.out; /** * Java class to be used in demonstrating the "switch on steroids" in Groovy. * The Groovy script will be able to {@code switch} on instances of this class * via the implicit invocation of {@code toString()} if the {@code case} * statements use {@code String}s as the items to match. */ public class SimpleState { private String stateName; public SimpleState(final String newStateName) { this.stateName = newStateName; } @Override public String toString() { return this.stateName; } } 

Die StringDarstellung der obigen Java-Klasse kann in einem Groovy-Skript aktiviert werden, wie in der nächsten Codeliste für Folgendes gezeigt switchOnSimpleState.groovy:

Listing 2. switchOnSimpleState.groovy

#!/usr/bin/env groovy import dustin.examples.SimpleState SimpleState state = new SimpleState("Colorado") print "The motto for the state of ${state.stateName} is '" switch (state) { case "Alabama": print "Audemus jura nostra defendere" break case "Alaska": print "North to the future" break case "Arizona": print "Ditat Deus" break case "Arkansas": print "Regnat populus" break case "California": print "Eureka" break case "Colorado": print "Nil sine numine" break case "Connecticut": print "Qui transtulit sustinet" break default : print "<>" } println "'" 

Wenn das obige Groovy-Skript für die obige einfache Java-Klasse ausgeführt wird, druckt der Code die richtigen Informationen aus, da Groovy die toString()Methode implizit für die Instanz "state" aufruft, die Stateeingeschaltet wird. Ähnliche Funktionen können jetzt in Java erreicht werden, aber man muss toString()das eingeschaltete Objekt explizit aufrufen . Es ist auch erwähnenswert, dass Java, als ich Anfang 2010 die Originalversion dieses Beitrags schrieb, das Einschalten von Strings nicht unterstützte. Die Ausgabe des Ausführens des oben genannten wird im folgenden Bildschirm-Snapshot angezeigt (der Name des Skripts stimmt oben nicht überein, da dies ein alter Bildschirm-Snapshot aus diesem ursprünglichen Beitrag ist, bevor er korrigiert und aktualisiert wurde).

Mit Groovy und der isCaseMethode kann ich fast jeden Datentyp einschalten, den ich mag. Um dies zu demonstrieren, wird die Java-Klasse Stateverwendet und ihre Codeliste wird unten gezeigt. Es enthält eine isCase(State)Methode, die Groovy implizit aufruft, wenn Instanzen von Stateals caseAuswahl umgeschaltet werden . In diesem Fall isCase(State)ruft die State.equals(Object)Methode die Methode einfach auf , um festzustellen, ob dies der Fall caseist. Obwohl dies das typische Verhalten für Implementierungen von ist isCase(Object), hätten wir feststellen können, ob dies der Fall war oder nicht, wie wir es wollten.

Listing 3. State.java

package dustin.examples; import static java.lang.System.out; public class State { private String stateName; public State(final String newStateName) { this.stateName = newStateName; } /** * Method to be used by Groovy's switch implicitly when an instance of this * class is switched on. * * @param compareState State passed via case to me to be compared to me. */ public boolean isCase(final State compareState) { return compareState != null ? compareState.equals(this) : false; } public boolean equals(final Object other) { if (!(other instanceof State)) { return false; } final State otherState = (State) other; if (this.stateName == null ? otherState.stateName != null : !this.stateName.equals(otherState.stateName)) { return false; } return true; } @Override public String toString() { return this.stateName; } } 

Die oben gezeigte einfache Standard-Java-Klasse implementiert eine isCaseMethode, mit der Groovy sie einschalten kann. Das folgende Groovy-Skript verwendet diese Klasse und kann die Instanz von erfolgreich aktivieren State.

#!/usr/bin/env groovy import dustin.examples.State State state = new State("Arkansas") State alabama = new State("Alabama") State arkansas = new State("Arkansas") State alaska = new State("Alaska") State arizona = new State("Arizona") State california = new State("California") State colorado = new State("Colorado") State connecticut = new State("Connecticut") print "The motto for the state of ${state.stateName} is '" switch (state) { case alabama : print "Audemus jura nostra defendere" break case alaska : print "North to the future" break case arizona : print "Ditat Deus" break case arkansas : print "Regnat populus" break case california : print "Eureka" break case colorado : print "Nil sine numine" break case connecticut : print "Qui transtulit sustinet" break default : print "<>" } println "'" 

Die Ausgabe im nächsten Screenshot zeigt an, dass das Groovy-Skript eine Instanz eines StateObjekts erfolgreich einschalten kann. Der erste Befehl wird unter Verwendung des „einfache“ Beispiel früher diskutiert und der zweite Befehl wird am Beispiel , dass der Bedarf zum Aufrufen State‚s - isCase(State)Methode.

Die Schönheit dieser Fähigkeit zu haben Klassen „schaltbarer“, bezogen auf die Implementierung eines isCase()Verfahrens ist , dass es kürzere Syntax in Situationen erlaubt , die sonst lange erforderlich könnte if/ else if/ elseKonstrukte. Es ist vorzuziehen, solche Konstrukte vollständig zu vermeiden, aber manchmal stoßen wir auf sie und die Groovy- switchAnweisung macht sie weniger langweilig.

Mit dem Groovy ist es durchaus möglich switch, dass mehrere Schalteroptionen den angegebenen Bedingungen entsprechen. Daher ist es wichtig, die caseAnweisungen in der Reihenfolge aufzulisten, in der die Übereinstimmung bevorzugt wird, da die erste Übereinstimmung die ausgeführte ist. Das breakSchlüsselwort wird in Groovy's switchwie in Java verwendet.

In dem, was der Groovy switchunterstützt, steckt viel mehr Kraft . Einige Beiträge, die diese Macht abdecken, beinhalten Groovy Goodness: The Switch Statement, Groovy, lassen Sie mich die Art und Weise zählen, wie ich dich liebe, und die Groovy-Dokumentation.

Diese Geschichte "Groovy: Steroide einschalten" wurde ursprünglich von JavaWorld veröffentlicht.