Programmering

Groovy: Tænd steroider

OPDATERING: Dette indlæg gennemgik betydelige opdateringer den 17. november 2016 for at rette fejlagtige udsagn og eksempler, for at rette det underliggende HTML-layout (ikke indlysende for læsere, medmindre du ser HTML-kilde i en webbrowser) og for at rette nogle staveproblemer. Hvis du af en eller anden grund vil se det gamle, forkerte indlæg, skal du tjekke den version, der er arkiveret af Wayback Machine.

Jeg har tidligere blogget angående Groovys støtte til at tænde streng. Groovy kan tænde meget mere end bare bogstaveligt Snors (og bogstavelige integraltyper, som Java tillader at tænde), og jeg demonstrerer dette kort her.

Groovy's kontakt erklæring vil bruge en metode implementeret med navnet "isCase"for at afgøre, om en bestemt kontakt valgmulighed matches. Dette betyder, at brugerdefinerede objekter kan "skiftes" i Groovy. For det enkle eksempel i dette blogindlæg bruger jeg Java-klasser SimpleState og Stat.java.

Notering 1. SimpleState.java

 pakke dustin. eksempler; importere statisk java.lang.System.out; / ** * Java-klasse, der skal bruges til at demonstrere "tænde steroider" i Groovy. * Groovy-scriptet kan {@code skifte} på forekomster af denne klasse * via den implicitte påkaldelse af {@code toString ()}, hvis {@code case} * udsagnene bruger {@code String} som elementerne at matche. * / public class SimpleState {private String stateName; offentlig SimpleState (endelig streng newStateName) {this.stateName = newStateName; } @ Override public String toString () {returner this.stateName; }} 

Ovenstående Java-klasser Snor repræsentation kan tændes i et Groovy-script som vist i den næste kodeliste for switchOnSimpleState.groovy:

Liste 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 ": print" 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 ovenstående Groovy-script køres mod ovenstående simple Java-klasse, udskriver koden de korrekte oplysninger, fordi Groovy implicit påberåber sig toString () metode på "tilstand" instansen af Stat bliver tændt. Lignende funktionalitet kan nu opnås i Java, men man skal udtrykkeligt ringe toString () på det objekt, der tændes. Det er også værd at huske på, at da Java skrev den oprindelige version af dette indlæg i begyndelsen af ​​2010, understøttede Java ikke at tænde for strenge. Outputtet fra at køre ovenstående vises på skærmbillede-snapshotet nedenfor (navnet på scriptet stemmer ikke overens ovenfor, fordi dette er et gammelt skærmbillede fra dette originale indlæg, før det blev rettet og opdateret).

Med Groovy og the isCase metode, kan jeg tænde næsten enhver datatype, jeg kan lide. For at demonstrere dette, Java-klassen Stat vil blive brugt, og kodelisten vises nedenfor. Det inkluderer en isCase (stat) metode, som Groovy implicit vil kalde, når forekomster af Stat bliver skiftet mod som sag valg. I dette tilfælde er isCase (stat) metode kalder simpelthen State.equals (Objekt) metode til at afgøre, om det sag er sandt. Selv om dette er den typiske adfærd for implementeringer af isCase (Objekt), kunne vi have fået det til at afgøre, om det var tilfældet eller ikke på nogen måde, vi ønskede.

Fortegnelse 3. State.java

pakke dustin. eksempler; importere statisk java.lang.System.out; public class State {private String stateName; offentlig tilstand (endelig streng newStateName) {this.stateName = newStateName; } / ** * Metode, der skal bruges af Groovys switch implicit, når en instans af denne * klasse er tændt. * * @param CompareState State sendes via sag til mig for at blive sammenlignet med mig. * / public boolean isCase (final State CompareState) {return CompareState! = null? CompareState.equals (dette): falsk; } offentlige boolske lig (endelig Objekt andet) {hvis (! (anden instans af stat)) {returner falsk; } final State otherState = (State) andet; hvis (this.stateName == null? otherState.stateName! = null:! this.stateName.equals (otherState.stateName)) {return false; } returner sandt } @ Override public String toString () {returner this.stateName; }} 

Den enkle standard Java-klasse vist ovenfor implementerer en isCase metode, der giver Groovy mulighed for at tænde den. Det følgende Groovy-script bruger denne klasse og er i stand til at tænde forekomsten af Stat.

#! / 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 "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 "'" " 

Outputtet i det næste skærmbillede snapshot indikerer, at Groovy-scriptet er i stand til med succes at tænde en forekomst af en Stat objekt. Den første kommando bruger det "enkle" eksempel, der er diskuteret tidligere, og den anden kommando bruger det eksempel, der skal påberåbes Stat's isCase (stat) metode.

Skønheden ved denne evne til at have klasser kan "skiftes" baseret på implementeringen af ​​en isCase () metoden er, at den tillader mere kortfattet syntaks i situationer, der ellers måske har krævet langvarig hvis/ellers hvis/andet konstruerer. Det foretrækkes at undgå sådanne konstruktioner fuldstændigt, men nogle gange løber vi ind i dem og Groovy kontakt erklæring gør dem mindre kedelige.

Det er fuldt ud muligt med Groovy kontakt at have flere switchindstillinger, der matcher de angivne betingelser. Derfor er det vigtigt at liste listen sag erklæringer, i hvilken rækkefølge der foretrækkes, fordi den første kamp er den, der udføres. Det pause nøgleord bruges i Groovy's kontakt som det er i Java.

Der er meget mere magt i hvad Groovy kontakt bakker op. Nogle stillinger, der dækker denne magt, inkluderer Groovy Goodness: Switch Statement, Groovy, lad mig tælle de måder, hvorpå jeg elsker dig, og Groovy-dokumentationen.

Denne historie, "Groovy: Switch on Steroids" blev oprindeligt udgivet af JavaWorld.