Groovy: activer les stéroïdes

MISE À JOUR: Ce message a fait l'objet de mises à jour importantes le 17 novembre 2016 pour corriger les déclarations et exemples erronés, pour corriger la mise en page HTML sous-jacente (pas évidente pour les lecteurs à moins que vous ne visualisiez la source HTML dans un navigateur Web) et pour résoudre certains problèmes d'orthographe. Si, pour une raison quelconque, vous souhaitez voir l'ancien message incorrect, consultez la version archivée par Wayback Machine.

J'ai déjà blogué sur le support de Groovy pour activer String. Groovy peut activer bien plus que des Strings littéraux (et des types intégraux littéraux que Java permet d'activer) et je le démontre brièvement ici.

La switchdéclaration de Groovy utilisera une méthode implémentée avec le nom " isCase" pour déterminer si une switchoption particulière correspond. Cela signifie que les objets personnalisés sont "commutables" dans Groovy. Pour l'exemple simple de ce billet de blog, j'utiliserai les classes Java SimpleStateet State.java.

Liste 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; } } 

La Stringreprésentation de la classe Java ci-dessus peut être activée dans un script Groovy comme indiqué dans la liste de code suivante pour switchOnSimpleState.groovy:

Liste 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 "'" 

Lorsque le script Groovy ci-dessus est exécuté sur la classe Java simple ci-dessus, le code imprime les informations correctes car Groovy appelle implicitement la toString()méthode sur l'instance "état" d' Stateêtre activée. Une fonctionnalité similaire peut maintenant être obtenue en Java, mais il faut appeler explicitement toString()l'objet à activer. Il convient également de garder à l'esprit que lorsque j'ai écrit la version originale de cet article au début de 2010, Java ne prenait pas en charge l'activation des chaînes. La sortie de l'exécution de ce qui précède est affichée dans l'instantané d'écran ci-dessous (le nom du script ne correspond pas ci-dessus car il s'agit d'un ancien instantané d'écran de ce message d'origine avant qu'il ne soit corrigé et mis à jour).

Avec Groovy et la isCaseméthode, je peux activer à peu près n'importe quel type de données que j'aime. Pour démontrer cela, la classe Java Statesera utilisée et sa liste de code est indiquée ci-dessous. Il inclut une isCase(State)méthode que Groovy appellera implicitement lorsque les instances de Statesont basculées en tant que casechoix. Dans ce cas, la isCase(State)méthode appelle simplement la State.equals(Object)méthode pour déterminer si c'est casevrai. Bien que ce soit le comportement typique pour les implémentations de isCase(Object), nous aurions pu le faire déterminer si c'était le cas ou non de la manière que nous voulions.

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; } } 

La classe Java standard simple présentée ci-dessus implémente une isCaseméthode qui permettra à Groovy de l'activer. Le script Groovy suivant utilise cette classe et parvient à activer l'instance de 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 "'" 

La sortie de la capture d'écran suivante indique que le script Groovy est capable de basculer correctement sur une instance d'un Stateobjet. La première commande utilise l 'exemple "simple" décrit précédemment et la seconde commande l' exemple qui doit invoquer Statela isCase(State)méthode de.

La beauté de cette capacité à avoir des classes "commutables" sur la base de l'implémentation d'une isCase()méthode est qu'elle permet une syntaxe plus concise dans des situations qui autrement auraient exigé de longues constructions if/ else if/ else. Il est préférable d'éviter complètement de telles constructions, mais parfois nous les rencontrons et l' switchinstruction Groovy les rend moins fastidieuses.

Il est tout à fait possible avec le Groovy switchque plusieurs options de commutation correspondent aux conditions spécifiées. Par conséquent, il est important de lister les caseinstructions dans l'ordre de la correspondance préférée car la première correspondance sera celle exécutée. Le breakmot-clé est utilisé dans Groovy switchcomme dans Java.

Il y a beaucoup plus de puissance dans ce que le Groovy switchprend en charge. Certains articles qui couvrent ce pouvoir incluent Groovy Goodness: The Switch Statement, Groovy, laissez-moi compter les façons dont je t'aime, et la documentation Groovy.

Cette histoire, "Groovy: Switch on Steroids" a été initialement publiée par JavaWorld.