Ohjelmointi

Groovy: Kytke steroidit päälle

PÄIVITTÄÄ: Tähän viestiin tehtiin merkittäviä päivityksiä 17. marraskuuta 2016 virheellisten lausuntojen ja esimerkkien korjaamiseksi, taustalla olevan HTML-asettelun korjaamiseksi (ei selvää lukijoille, ellet tarkastele HTML-lähdettä verkkoselaimessa) ja joidenkin oikeinkirjoitusongelmien korjaamiseksi. Jos haluat jostain syystä nähdä vanhan, väärän viestin, tutustu Wayback Machine -arkistamaan versioon.

Olen aiemmin kirjoittanut blogia Groovyn tuesta Stringin kytkemiseen. Groovy voi kytkeä päälle paljon muutakin kuin vain kirjaimellisen Merkkijonos (ja kirjaimelliset integraalityypit, jotka Java sallii käynnistämisen), ja esitän tämän lyhyesti tässä.

Groovyn vaihtaa lauseessa käytetään menetelmää, joka on toteutettu nimellä "isCase"sen määrittämiseksi, onko tietty vaihtaa vaihtoehto on vastaava. Tämä tarkoittaa, että mukautetut objektit ovat "vaihdettavissa" Groovyssä. Tämän blogiviestin yksinkertaisessa esimerkissä käytän Java-luokkia SimpleState ja Osavaltio.java.

Listaus 1. SimpleState.java

 pakkaus pölyä.esimerkkejä; tuo staattinen java.lang.System.out; / ** * Java-luokka, jota käytetään osoittamaan "kytke steroidit päälle" Groovyssä. * Groovy-komentosarja voi {@code switch} ottaa käyttöön tämän luokan esiintymiä * implisiittisen {@code toString ()} -viestin avulla, jos {@code case} * -käskyissä käytetään {@code String} -merkkejä. vastaamaan. * / public class SimpleState {private String stateName; public SimpleState (viimeinen merkkijono newStateName) {this.stateName = newStateName; } @Override public String toString () {return this.stateName; }} 

Yllä olevat Java-luokat Merkkijono esitys voidaan kytkeä päälle Groovy-komentosarjassa, kuten seuraavassa koodiluettelossa osoitetaan switchOnSimpleState.groovy:

Listaus 2. switchOnSimpleState.groovy

#! / usr / bin / env groovy import dustin.examples.SimpleState SimpleState state = new SimpleState ("Colorado") print "$ {state.stateName} -tilan motto on" "switch (osavaltio) {tapaus" Alabama ": tulosta" Audemus jura nostra defere "-taukotapaus" Alaska ": tulosta" pohjoisesta tulevaisuuteen "-taustakotelo" Arizona ": tulosta" Ditat Deus "-taustakotelo" Arkansas ": tulosta" Regnat populus "-taustakoko" Kalifornia ": tulosta "Eureka" -katkokotelo "Colorado": tulosta "tyhjä sininumero" rikkoutumistapa "Connecticut": tulosta "Qui transtulit sustinet" -katkos oletus: tulosta "<>"} println "'" 

Kun yllä oleva Groovy-komentosarja suoritetaan yllä olevaa yksinkertaista Java-luokkaa vastaan, koodi tulostaa oikeat tiedot, koska Groovy epäsuorasti kutsuu toString () menetelmä "valtion" esiintymässä Osavaltio kytketään päälle. Samanlainen toiminnallisuus voidaan nyt saavuttaa Java-sovelluksessa, mutta sinun on nimenomaisesti soitettava toString () päällä olevaan esineeseen. On myös syytä muistaa, että kun kirjoitin alkuperäisen version tästä viestistä vuoden 2010 alussa, Java ei tue merkkijonojen kytkemistä päälle. Edellä mainitun suorittamisen tulos näkyy alla olevassa kuvakaappauksessa (komentosarjan nimi ei vastaa yllä olevaa, koska tämä on vanha näyttökuva tästä alkuperäisestä viestistä ennen sen korjaamista ja päivittämistä).

Groovyn ja isCase menetelmällä, voin kytkeä päälle melkein minkä tahansa haluamasi tietotyypin. Tämän osoittamiseksi Java-luokka Osavaltio käytetään ja sen koodiluettelo on esitetty alla. Se sisältää a isCase (osavaltio) menetelmä, jota Groovy epäsuorasti kutsuu, kun Osavaltio on kytketty vastaan ​​kuin tapauksessa valintoja. Tässä tapauksessa isCase (osavaltio) menetelmä yksinkertaisesti kutsuu State.equals (objekti) menetelmä sen selvittämiseksi tapauksessa on totta. Vaikka tämä on tyypillistä käyttäytymistä isCase (objekti), olisimme voineet saada sen selvittämään, oliko asia vai ei millään tavalla, mitä halusimme.

Listaus 3. State.java

pakkaus pölyä.esimerkkejä; tuo staattinen java.lang.System.out; public class State {private String stateName; public state (lopullinen merkkijono newStateName) {this.stateName = newStateName; } / ** * Menetelmä, jota Groovyn kytkimen on käytettävä implisiittisesti, kun tämän * luokan esiintymä kytketään päälle. * * @param salīdzaaTilavaltio välitti minulle tapauksen kautta verratakseni minua. * / public boolean isCase (lopullinen tila vertaile valtiota) {return vertaile valtiota! = null? CompareState.equals (tämä): false; } public boolean equals (final Object other) {if (! (other state of State)) {return false; } lopullinen valtio muu valtio = (osavaltio) muu; jos (this.stateName == null? otherState.stateName! = null:! this.stateName.equals (otherState.stateName)) {palauttaa false; } return true; } @Override public String toString () {return this.stateName; }} 

Yllä esitetty yksinkertainen tavallinen Java-luokka toteuttaa isCase menetelmä, jonka avulla Groovy voi kytkeä sen päälle. Seuraava Groovy-komentosarja käyttää tätä luokkaa ja pystyy käynnistämään onnistuneesti Osavaltio.

#! / usr / bin / env groovy import dustin.esimerkkejä.Valtion osavaltio = uusi osavaltio ("Arkansas") osavaltio alabama = uusi osavaltio ("Alabama") osavaltio arkansas = uusi osavaltio ("Arkansas") osavaltio alaska = uusi osavaltio ("Alaska") osavaltio arizona = uusi osavaltio ("Arizona") osavaltio kalifornia = uusi osavaltio ("Kalifornia") osavaltio colorado = uusi osavaltio ("Colorado") osavaltio connecticut = uusi osavaltio ("Connecticut") tulosta "Motto tila $ {state.stateName} on "" kytkin (osavaltio) {tapaus alabama: tulosta "Audemus jura nostra puolustaja" taukotapa alaska: tulosta "pohjoiseen tulevaisuuteen" taukotapa arizona: tulosta "Ditat Deus" rikkoutumistapa 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 "'" 

Seuraavan näytön tilannekuvan tulos osoittaa, että Groovy-komentosarja pystyy käynnistämään onnistuneesti a-ilmentymän Osavaltio esine. Ensimmäinen komento käyttää aiemmin käsiteltyä "yksinkertaista" esimerkkiä ja toinen komento käyttää esimerkkiä, joka täytyy käynnistää Osavaltioon isCase (osavaltio) menetelmä.

Tämän kyvyn saada luokat olla "vaihdettavissa" kauneuteen perustuen isCase () Menetelmä on, että se sallii tiukemman syntaksin tilanteissa, jotka muuten olisivat saattaneet vaatia pitkiä jos/muuten jos/muu rakentaa. On parempi välttää tällaisia ​​rakenteita kokonaan, mutta joskus törmäämme niihin ja Groovyyn vaihtaa lausunto tekee heistä vähemmän tylsiä.

Se on täysin mahdollista Groovyn kanssa vaihtaa saada useita kytkinvaihtoehtoja vastaamaan määritettyjä ehtoja. Siksi on tärkeää luetella tapauksessa lauseet, joiden ottelu on suositeltava, koska ensimmäinen ottelu toteutetaan. tauko avainsanaa käytetään Groovy's vaihtaa kuten se on Javassa.

Groovyn toiminnassa on paljon enemmän voimaa vaihtaa tukee. Joitakin tämän voiman kattavia viestejä ovat Groovy Goodness: The Switch Statement, Groovy, anna minun laskea tapoja, joilla rakastan sinua, ja Groovy-ohjeet.

Tämän tarinan "Groovy: Kytke steroidit päälle" julkaisi alun perin JavaWorld.