Groovy: attiva gli steroidi

AGGIORNAMENTO: questo post è stato sottoposto ad aggiornamenti significativi il 17 novembre 2016 per correggere affermazioni ed esempi errati, per correggere il layout HTML sottostante (non ovvio per i lettori a meno che non si visualizzi il codice HTML in un browser web) e per risolvere alcuni problemi di ortografia. Se per qualche motivo vuoi vedere il vecchio post errato, controlla la versione archiviata dalla Wayback Machine.

Ho già scritto sul blog riguardo al supporto di Groovy per l'accensione di String. Groovy può attivare molto di più che solo Strings letterali (e tipi integrali letterali che Java consente di attivare) e lo dimostrerò brevemente qui.

L' switchistruzione di Groovy utilizzerà un metodo implementato con il nome " isCase" per determinare se una particolare switchopzione corrisponde. Ciò significa che gli oggetti personalizzati sono "commutabili" in Groovy. Per il semplice esempio in questo post del blog, userò le classi Java SimpleStatee State.java.

Listato 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 Stringrappresentazione della classe Java sopra può essere attivata in uno script Groovy come mostrato nel prossimo elenco di codice per switchOnSimpleState.groovy:

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

Quando lo script Groovy precedente viene eseguito sulla semplice classe Java precedente, il codice stampa le informazioni corrette perché Groovy invoca implicitamente il toString()metodo sull'istanza di "stato" di Stateessere attivato. Funzionalità simili possono ora essere ottenute in Java, ma è necessario chiamare esplicitamente toString()l'oggetto che viene acceso. Vale anche la pena tenere presente che quando ho scritto la versione originale di questo post all'inizio del 2010, Java non supportava l'attivazione di stringhe. L'output dell'esecuzione di quanto sopra è mostrato nell'istantanea della schermata qui sotto (il nome dello script non corrisponde sopra perché si tratta di una vecchia istantanea della schermata da questo post originale prima che fosse corretto e aggiornato).

Con Groovy e il isCasemetodo, posso attivare quasi tutti i tipi di dati che mi piacciono. Per dimostrare ciò, Stateverrà utilizzata la classe Java e il suo elenco di codice è mostrato di seguito. Include un isCase(State)metodo che Groovy chiamerà implicitamente quando le istanze di Statevengono scambiate contro come casescelte. In questo caso, il isCase(State)metodo chiama semplicemente il State.equals(Object)metodo per determinare se caseè vero. Sebbene questo sia il comportamento tipico per le implementazioni di isCase(Object), avremmo potuto far sì che determinasse se era il caso o meno in qualsiasi modo volevamo.

Listato 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 semplice classe Java standard mostrata sopra implementa un isCasemetodo che consentirà a Groovy di attivarlo. Il seguente script Groovy utilizza questa classe ed è in grado di attivare correttamente l'istanza di 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 "'" 

L'output nell'istantanea della schermata successiva indica che lo script Groovy è in grado di attivare correttamente un'istanza di un Stateoggetto. Il primo comando utilizza l'esempio "semplice" discusso in precedenza e il secondo comando utilizza l'esempio che deve invocare Stateil isCase(State)metodo di.

La bellezza di questa capacità di avere classi "commutabili" in base all'implementazione di un isCase()metodo è che consente una sintassi più concisa in situazioni che altrimenti avrebbero richiesto lunghi costrutti if/ else if/ else. È preferibile evitare completamente tali costrutti, ma a volte li incontriamo e l' switchaffermazione Groovy li rende meno noiosi.

È del tutto possibile con Groovy switchavere più opzioni di commutazione che corrispondono alle condizioni specificate. Pertanto, è importante elencare le caseistruzioni in base a quale corrispondenza è preferita perché la prima corrispondenza sarà quella eseguita. La breakparola chiave viene utilizzata in Groovy switchcome in Java.

C'è molto più potere in ciò che switchsupporta Groovy . Alcuni post che trattano questo potere includono Groovy Goodness: The Switch Statement, Groovy, fammi contare i modi in cui ti amo, e la documentazione di Groovy.

Questa storia, "Groovy: Switch on Steroids" è stata originariamente pubblicata da JavaWorld.