Programmering

Groovy: Slå på steroider

OPPDATER: Dette innlegget gjennomgikk betydelige oppdateringer 17. november 2016 for å rette opp feilaktige uttalelser og eksempler, for å fikse det underliggende HTML-oppsettet (ikke åpenbart for leserne med mindre du ser HTML-kilden i en nettleser), og for å fikse noen staveproblemer. Hvis du av en eller annen grunn vil se det gamle, feil innlegget, kan du sjekke ut versjonen som er arkivert av Wayback Machine.

Jeg har blogget før angående Groovys støtte for å slå på String. Groovy kan slå på mye mer enn bare bokstavelig Strings (og bokstavelig integrerte typer som Java tillater å slå på) og jeg demonstrerer dette kort her.

Groovy's bytte om uttalelse vil bruke en metode implementert med navnet "isCase"for å avgjøre om en bestemt bytte om alternativet samsvarer. Dette betyr at egendefinerte objekter er "byttbare" i Groovy. For det enkle eksemplet i dette blogginnlegget bruker jeg Java-klassene SimpleState og State.java.

Oppføring 1. SimpleState.java

 pakke dustin. eksempler; importere statisk java.lang.System.out; / ** * Java-klasse som skal brukes til å demonstrere "slå på steroider" i Groovy. * Groovy-skriptet vil kunne {@code switch} på forekomster av denne klassen * via den implisitte påkallingen av {@code toString ()} hvis {@code case} * uttalelsene bruker {@code String} som elementene å passe sammen. * / offentlig klasse SimpleState {private String stateName; offentlig SimpleState (endelig streng newStateName) {this.stateName = newStateName; } @ Override public String toString () {return this.stateName; }} 

Ovenstående Java-klasser String representasjon kan slås på i et Groovy-skript som vist i neste kodeliste for switchOnSimpleState.groovy:

Oppføring 2. switchOnSimpleState.groovy

#! / usr / bin / env groovy import dustin.examples.SimpleState SimpleState state = new SimpleState ("Colorado") print "Mottoet for staten $ {state.stateName} er '" switch (state) {case "Alabama ": trykk" Audemus jura nostra forsvarere "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 standard: print "<>"} println "'" 

Når Groovy-skriptet ovenfor kjøres mot den ovennevnte enkle Java-klassen, skriver koden ut riktig informasjon fordi Groovy implisitt påkaller toString () metoden på "tilstand" forekomsten av Stat blir slått på. Lignende funksjonalitet kan nå oppnås i Java, men man må eksplisitt ringe toString () på objektet som slås på. Det er også verdt å huske på at da jeg skrev den opprinnelige versjonen av dette innlegget tidlig på 2010, støttet Java ikke å slå på strenger. Resultatet av å kjøre ovenstående vises på skjermbildet nedenfor (navnet på skriptet samsvarer ikke med over fordi dette er et gammelt skjermbilde fra dette originale innlegget før det ble korrigert og oppdatert).

Med Groovy og the isCase metode, kan jeg slå på omtrent hvilken datatype jeg liker. For å demonstrere dette, Java-klassen Stat vil bli brukt, og kodelisten vises nedenfor. Det inkluderer en isCase (State) metode som Groovy implisitt vil kalle når forekomster av Stat blir byttet mot som sak valg. I dette tilfellet isCase (State) metoden bare kaller State.equals (Objekt) metode for å avgjøre om det sak er sant. Selv om dette er den typiske oppførselen for implementeringer av isCase (Objekt), kunne vi ha fått det til å avgjøre om det var tilfelle eller ikke på noen måte vi ønsket.

Oppføring 3. State.java

pakke dustin. eksempler; importere statisk java.lang.System.out; offentlig klasse State {private String stateName; offentlig stat (endelig streng newStateName) {this.stateName = newStateName; } / ** * Metode som skal brukes av Groovys bryter implisitt når en forekomst av denne * klassen er slått på. * * @param CompareState State overført via sak til meg for å bli sammenlignet med meg. * / public boolean isCase (final State CompareState) {return CompareState! = null? CompareState.equals (dette): false; } offentlige boolske likheter (endelig Objekt annet) {if (! (annen forekomst av stat)) {return false; } final State otherState = (State) other; hvis (this.stateName == null? otherState.stateName! = null:! this.stateName.equals (otherState.stateName)) {return false; } returner sant; } @ Override public String toString () {return this.stateName; }} 

Den enkle standard Java-klassen vist ovenfor implementerer en isCase metode som lar Groovy slå på den. Følgende Groovy-skript bruker denne klassen og er i stand til å slå på forekomsten av Stat.

#! / usr / bin / en 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 "Mottoet for staten $ {state.stateName} er '"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 standard: print "<>"} println "'" 

Utdataene i neste skjermbilde viser at Groovy-skriptet er i stand til å slå på en forekomst av en Stat gjenstand. Den første kommandoen bruker det "enkle" eksemplet som ble diskutert tidligere, og den andre kommandoen bruker eksemplet som må påberopes Stats isCase (State) metode.

Skjønnheten i denne evnen til å ha klasser kan være "byttbar" basert på implementeringen av en isCase () metoden er at den tillater mer kortfattet syntaks i situasjoner som ellers kan ha krevd langvarig hvis/eller hvis/ellers konstruerer. Det er å foretrekke å unngå slike konstruksjoner helt, men noen ganger støter vi på dem og Groovy bytte om uttalelse gjør dem mindre kjedelige.

Det er fullt mulig med Groovy bytte om å ha flere bryteralternativer som samsvarer med de angitte forholdene. Derfor er det viktig å liste opp sak uttalelser i hvilken rekkefølge som foretrekkes fordi den første kampen blir den som blir utført. De gå i stykker nøkkelord brukes i Groovy's bytte om slik det er i Java.

Det er mye mer kraft i det Groovy bytte om støtter. Noen innlegg som dekker denne kraften inkluderer Groovy Goodness: The Switch Statement, Groovy, la meg telle måtene jeg elsker deg på, og Groovy-dokumentasjonen.

Denne historien, "Groovy: Switch on Steroids" ble opprinnelig utgitt av JavaWorld.

$config[zx-auto] not found$config[zx-overlay] not found