Groovy: Uključite steroide

AŽURIRANJE: Ovaj je post doživio značajna ažuriranja 17. studenog 2016. radi ispravljanja pogrešnih izjava i primjera, popravljanja osnovnog HTML izgleda (koji čitateljima nije očit ako HTML izvor ne pregledavate u web pregledniku) i rješavanja nekih problema s pravopisom. Ako iz nekog razloga želite vidjeti stari, netočni post, pogledajte verziju koju je arhivirao Wayback Machine.

Već sam blogovao o Groovyjevoj podršci za uključivanje Stringa. Groovy može uključiti mnogo više od samo doslovnih Strings (i doslovnih integralnih tipova koje Java omogućuje uključivanje) i to ću ovdje kratko pokazati.

Groovyjeva switchizjava upotrijebit će metodu implementiranu s imenom " isCase" da utvrdi odgovara li određena switchopcija. To znači da su prilagođeni objekti u Groovyu "preklopljivi". Za jednostavni primjer u ovom postu na blogu upotrijebit ću Java tečajeve SimpleStatei State.java.

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

Prikaz gornje Java klase Stringmože se uključiti u Groovy skripti kao što je prikazano u sljedećem popisu kodova za switchOnSimpleState.groovy:

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

Kada se gornja skripta Groovy pokrene protiv gore navedene jednostavne Java klase, kôd ispisuje ispravne podatke jer Groovy implicitno poziva toString()metodu na instanci "stanje" kada Stateje uključen. Slična funkcionalnost sada se može postići u Javi, ali treba izričito pozvati toString()objekt koji se uključuje. Također vrijedi imati na umu da kada sam početkom 2010. napisao originalnu verziju ovog posta, Java nije podržavala uključivanje žica. Rezultat pokretanja gore navedenog prikazan je na snimci zaslona ispod (naziv skripte se ne podudara s gornjim, jer je ovo stara snimka zaslona iz ovog izvornog posta prije nego što je ispravljena i ažurirana).

Uz Groovy i isCasemetodu mogu uključiti gotovo bilo koju vrstu podataka koja mi se sviđa. Da bi se to demonstriralo, koristit će se Java klasa State, a njezin popis kodova prikazan je u nastavku. Uključuje isCase(State)metodu koju će Groovy implicitno pozvati kad se primjeri Stateprebace kao caseizbor. U ovom slučaju, isCase(State)metoda jednostavno poziva State.equals(Object)metodu kako bi utvrdila je li to caseistina. Iako je ovo tipično ponašanje za implementacije isCase(Object), mogli smo ga odrediti je li to slučaj ili ne, na bilo koji način koji smo željeli.

Popis 3. Država.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; } } 

Gore prikazana jednostavna standardna Java klasa implementira isCasemetodu koja će Groovyju omogućiti da je uključi. Sljedeća Groovy skripta koristi ovu klasu i može uspješno uključiti instancu 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 "'" 

Izlaz u sljedećoj snimci zaslona pokazuje da je skripta Groovy u stanju uspješno uključiti instancu Stateobjekta. Prva naredba se koristi na „jednostavan” primjer raspravljali ranije, a druga naredba je na primjeru koji treba pozvati State„s isCase(State)metodu.

Ljepota ove mogućnosti da se klase mogu "prebacivati" na temelju provedbe isCase()metode je u tome što omogućuje sažetiju sintaksu u situacijama koje bi inače mogle zahtijevati dugotrajne if/ else if/ elsekonstrukcije. Poželjno je takve konstrukcije u potpunosti izbjegavati, ali ponekad naletimo na njih i Groovyjeva ih switchizjava čini manje dosadnima.

S Groovyjem je potpuno moguće switchda više opcija prekidača odgovaraju navedenim uvjetima. Stoga je važno navesti caseizjave prema redoslijedu koji se pogodak preferira jer će prvo podudaranje biti ono izvršeno. breakKljučna riječ se koristi u Groovy je switchkao što je to u Javi.

Puno je više snage u onome što Groovy switchpodržava. Neki postovi koji pokrivaju ovu moć uključuju Groovy Goodness: The Switch Statement, Groovy, dopustite mi da izbrojim načine na koje vas volim i Groovy dokumentaciju.

Ovu priču "Groovy: Uključi steroide" izvorno je objavio JavaWorld.