Uvod u Groovy jezik

1. Pregled

Groovy je dinamičan, skriptni jezik za JVM. Kompajlira se u bajt kod i neprimjetno se kombinira s Java kodom i knjižnicama.

U ovom ćemo članku pogledati neke od bitnih značajki Groovyja, uključujući osnovnu sintaksu, kontrolne strukture i zbirke.

Zatim ćemo pogledati neke od glavnih značajki koje ga čine privlačnim jezikom, uključujući nulu sigurnost, implicitnu istinu, operatore i nizove.

2. Okoliš

Ako želimo koristiti Groovy u projektima Maven, moramo dodati sljedeće u pom.xml:

  // ... org.codehaus.gmavenplus gmavenplus-plugin 1.5 // ... org.codehaus.groovy groovy-all 2.4.10 

Najnoviji dodatak Maven možete pronaći ovdje i najnoviju verziju groovy-all ovdje.

3. Osnovne značajke

U Groovyju postoje mnoge korisne značajke. Pogledajmo sada osnovne građevne blokove jezika i kako se razlikuje od Jave.

Pogledajmo sada osnovne građevne blokove jezika i kako se razlikuje od Jave.

3.1. Dinamično tipkanje

Jedna od najvažnijih značajki Groovyja je podrška za dinamičko tipkanje.

Definicije tipova nisu obavezne, a stvarne vrste određuju se tijekom izvođenja. Pogledajmo ove dvije klase:

klasa Patka {String getName () {'Duck'}} klasa Mačka {String getName () {'Mačka'}} 

Te dvije klase definiraju isto getName metoda, ali nije izričito definirana u ugovoru.

Zamislite sada da imamo popis predmeta koji sadrže patke i mačke koje imaju getName metoda. S Groovyjem možemo učiniti sljedeće:

Patka patka = nova patka () Mačka mačka = nova Mačka () def list = [patka, mačka] list.each {obj -> println obj.getName ()}

Kôd će se prevesti, a izlazni kod gore navedenog bio bi:

Mačka patka

3.2. Implicitna istinita pretvorba

Kao i u JavaScript-u, Groovy svaki objekt procjenjuje na logičku vrijednost ako je potrebno, npr. kada se koristi unutar ako izjava ili pri negiranju vrijednosti:

if ("zdravo") {...} if (15) {...} if (someObject) {...}

Postoji nekoliko jednostavnih pravila kojih se trebate sjetiti u vezi s ovom pretvorbom:

  • Neprazno Zbirke, nizovi, mape procjenjuju na pravi
  • Podudaranje s najmanje jednim podudaranjem ocjenjuje na pravi
  • Iteratore i Nabrajanja s daljnjim elementima prisiljavaju se na pravi
  • Neprazno Žice, GStrings i CharSequences, prisiljeni su na pravi
  • Brojevi koji nisu nula procjenjuju se na pravi
  • Prisiljavaju se reference koje nisu null pravi

Ako želimo prilagoditi implicitnu istinitu pretvorbu, možemo definirati našu asBoolean () metoda.

3.3. Uvoz

Neki se paketi uvoze prema zadanim postavkama i ne moramo ih eksplicitno uvesti:

import java.lang. * import java.util. * import java.io. * import java.net. * import groovy.lang. * import groovy.util. * import java.math.BigInteger import java.math.BigDecimal

4. AST transformacije

AST (Stablo apstraktne sintakse) transformira omogućuje nam da se uključimo u postupak kompilacije Groovy i prilagodimo ga u skladu s našim potrebama. To se radi u vrijeme kompilacije, tako da nema kazne za izvedbu prilikom pokretanja aplikacije. Možemo stvoriti naše AST transformacije, ali možemo koristiti i ugrađene.

Možemo stvoriti svoje transformacije ili možemo imati koristi od ugrađenih.

Pogledajmo neke bilješke koje vrijedi znati.

4.1. Bilješka Provjereno

Ova se napomena koristi za prisiljavanje prevoditelja na strogu provjeru tipa s označenim dijelovima koda. Mehanizam provjere tipa je proširiv, pa čak možemo pružiti čak i strožu provjeru tipa od one koja je dostupna u Javi po želji.

Pogledajmo primjer u nastavku:

class Universe {@TypeChecked int answer () {"četrdeset dva"}}

Ako pokušamo sastaviti ovaj kod, primijetit ćemo sljedeću pogrešku:

[Provjera statičkog tipa] - Nije moguće vratiti vrijednost tipa java.lang.String na metodi koja vraća tip int

The @TypeChecked anotacija se može primijeniti na klase i metode.

4.2. Bilješka CompileStatic

Ova napomena omogućuje prevoditelju da izvršava provjere vremena prevođenja kao što se to radi s Java kodom. Nakon toga kompajler izvodi statičku kompilaciju, zaobilazeći tako protokol Groovy metaobjekta.

Kada je klasa označena, sve metode, svojstva, datoteke, unutarnje klase itd. Označene klase provjerit će se tipom. Kada je metoda označena, statička se kompilacija primjenjuje samo na one stavke (zatvaranja i anonimne unutarnje klase) koje su obuhvaćene tom metodom.

5. Svojstva

U Groovyu možemo stvoriti POGO-ove (obični stari Groovy objekti) koji rade na isti način kao POJO-ovi u Javi, iako su kompaktniji jer geteri i postavljači automatski se generiraju za javna svojstva tijekom sastavljanja. Važno je zapamtiti da će se generirati samo ako još nisu definirani.

To nam daje fleksibilnost definiranja atributa kao otvorenih polja uz zadržavanje mogućnosti nadjačavanja ponašanja prilikom postavljanja ili dobivanja vrijednosti.

Razmotrite ovaj objekt:

klasa Osoba {Ime niza String lastName}

Budući da je zadani opseg za klase, polja i metode javno - ovo je javna klasa, a dva su polja javna.

Prevoditelj će ih pretvoriti u privatna polja i dodati getName (), setName (), getLastName () i setLasfName () metode. Ako definiramo seter i getter za određeno polje, prevodilac neće stvoriti javnu metodu.

5.1. Oznake prečaca

Groovy nudi oznaku prečaca za dobivanje i postavljanje svojstava. Umjesto Java načina pozivanja getera i postavljača, možemo koristiti oznaku pristupa nalik na polje:

resourceGroup.getResourcePrototype (). getName () == SERVER_TYPE_NAME resourceGroup.resourcePrototype.name == SERVER_TYPE_NAME resourcePrototype.setName ("nešto") resourcePrototype.name = "nešto"

6. Operateri

Pogledajmo sada nove operatore dodane povrh onih poznatih iz obične Jave.

6.1. Nužno sigurno preusmjeravanje

Najpopularniji je nule-siguran operator preusmjeravanja “?” što nam omogućuje da izbjegnemo a NullPointerException prilikom pozivanja metode ili pristupanja svojstvu a null objekt. Posebno je korisno u lančanim pozivima gdje a null vrijednost bi se mogla pojaviti u nekom trenutku lanca.

Na primjer, možemo sigurno nazvati:

Ime niza = osoba? .Organizacija? .Vidno? .Ime

U gornjem primjeru ako a osoba, osoba.organizacija, ili organizacija.vidno jesu null, onda null se vraća.

6.2. Elvis Operator

Elvisov operater “?:”Omogućuje nam sažimanje ternarnih izraza. Ovo dvoje je ekvivalentno:

Ime niza = person.name?: DefaultName

i

Ime niza = person.name? person.name: defaultName

Oboje dodjeljuju vrijednost osoba.ime na varijablu imena ako jest Groovy istina (u ovom slučaju ne null i ima a ne-nula duljina).

6.3. Operator svemirskog broda

Operator svemirskog broda “” je relacijski operator koji se ponaša poput Javinog compareTo () koja uspoređuje dva objekta i vraća -1, 0 ili +1, ovisno o vrijednostima oba argumenta.

Ako je lijevi argument veći od desnog, operator vraća 1. Ako je lijevi argument manji od desnog, operator vraća -1. Ako su argumenti jednaki, vraća se 0.

Najveća prednost korištenja operatora usporedbe je glatko rukovanje s nula takav da x y nikada neće baciti a NullPointerException:

println 5 null

Gornji primjer će kao rezultat ispisati 1.

7. Žice

Postoji više načina za izražavanje nizovnih literala. Podržan je pristup koji se koristi u Javi (nizovi s dvostrukim navodnicima), ali također je dopušteno koristiti pojedinačne navodnike kada je to poželjno.

Podržani su i višeredni nizovi, koji se na drugim jezicima ponekad nazivaju i heredoci, koristeći trostruke navodnike (bilo jednostruke ili dvostruke).

Podržani su i višeredni nizovi, koji se na drugim jezicima ponekad nazivaju i heredoci, koristeći trostruke navodnike (bilo jednostruke ili dvostruke).

Nizovi definirani dvostrukim navodnicima podržavaju interpolaciju pomoću ${} sintaksa:

def name = "Bill Gates" def pozdrav = "Pozdrav, $ {name}"

U stvari, bilo koji izraz može se smjestiti unutar ${}:

def name = "Bill Gates" def pozdrav = "Pozdrav, $ {name.toUpperCase ()}"

Niz s dvostrukim navodnicima naziva se GString ako sadrži izraz ${}, inače, to je ravnica Niz objekt.

Kôd u nastavku pokrenut će se bez neuspjeha na testu:

def a = "hello" potvrditi a.class.name == 'java.lang.String' def b = 'hello' potvrditi b.class.name == 'java.lang.String' def c = "$ {b} "potvrditi c.class.name == 'org.codehaus.groovy.runtime.GStringImpl'

8. Zbirke i karte

Pogledajmo kako se postupa s nekim osnovnim strukturama podataka.

8.1. Popisi

Evo nekoliko koda za dodavanje nekoliko elemenata u novu instancu ArrayList na Javi:

Lista popisa = novi ArrayList (); list.add ("Pozdrav"); list.add ("Svijet");

I ovdje je ista operacija u Groovyju:

Popis popisa = ['Pozdrav', 'Svijet']

Popisi su prema zadanim postavkama tipa java.util.ArrayList a može se i eksplicitno deklarirati pozivanjem odgovarajućeg konstruktora.

Ne postoji zasebna sintaksa za Postavi, ali možemo koristiti tip prisila za to. Ili upotrijebite:

Postavite pozdrav = ['Pozdrav', 'Svijet']

ili:

def pozdrav = ['Pozdrav', 'Svijet'] kao Postavljanje

8.2. Karta

Sintaksa za a Karta je sličan, iako malo opširniji, jer moramo biti u mogućnosti odrediti ključeve i vrijednosti razdvojene dvotačkom:

def key = 'Key3' def aMap = ['Key1': 'Value 1', Key2: 'Value 2', (key): 'Druga vrijednost']

Nakon ove inicijalizacije dobit ćemo novu LinkedHashMap s unosima: Tipka1 -> Vrijednost1, Ključ2 -> Vrijednost 2, Ključ3 -> Druga vrijednost.

Ulazima na karti možemo pristupiti na više načina:

println aMap ['Key1'] println aMap [key] println aMap.Key1

9. Kontrolne strukture

9.1. Uvjeti: ako-drugo

Groovy podržava uvjetnu ako / inače sintaksa prema očekivanjima:

if (...) {// ...} else if (...) {// ...} else {// ...} 

9.2. Uvjeti: preklopno kućište

The sklopka Izjava je kompatibilna s Java kodom, tako da možemo prolaziti kroz slučajeve koji dijele isti kod za više podudaranja.

Najvažnija je razlika što a sklopka može izvršiti podudaranje s više različitih vrsta vrijednosti:

def x = 1,23 def result = "" switch (x) {case "foo": result = "found foo" break case "bar": result + = "bar" case break [4, 5, 6, 'inList'] : result = "list" break case 12..30: result = "range" break case Broj: result = "number" break case ~ / fo * /: result = "foo regex" break case {it <0}: / / ili {x <0} rezultat = "negativan" prekid zadani: rezultat = "zadani"} println (rezultat)

Ispisat će se gornji primjer broj.

9.3. Petlje: dok

Groovy podržava uobičajeno dok petlje kao što to čini Java:

def x = 0 def y = 5 dok je (y--> 0) {x ++}

9.4. Petlje: za

Groovy prihvaća ovu jednostavnost i snažno potiče za petlje slijedeći ovu strukturu:

za (varijabla u iterableu) {body}

The za petlja se ponavlja iterabilan. Često korišteni iterabli su rasponi, zbirke, karte, nizovi, iteratori i nabrajanja. Zapravo, svaki objekt može biti iterabilan.

Zagrade oko tijela nisu obvezne ako se sastoje od samo jedne izjave. Ispod su primjeri ponavljanja a domet, popis, niz, karta, i žice:

def x = 0 za (i u 0..9) {x + = i} x = 0 za (i u [0, 1, 2, 3, 4]) {x + = i} def niz = (0. .4) .toArray () x = 0 za (i u nizu) {x + = i} def map = ['abc': 1, 'def': 2, 'xyz': 3] x = 0 for (e na mapi) {x + = e.value} x = 0 za (v u map.values ​​()) {x + = v} def text = "abc" def list = [] za (c u tekstu) {popis. dodaj (c)}

Iteracija objekta čini Groovyja za-petljati sofisticiranu upravljačku strukturu. To je valjana pandan upotrebi metoda koje se ponavljaju nad objektom sa zatvaračima, poput upotrebe Zbirka svaka metoda.

Glavna razlika je u tome što je tijelo a za petlja nije zatvaranje, to znači da je ovo tijelo blok:

za (x u 0..9) {println x}

dok je ovo tijelo zatvaranje:

(0..9) .each {println it}

Iako izgledaju slično, u konstrukciji su vrlo različiti.

Zatvarač je vlastiti objekt i ima različite značajke. Može se konstruirati na drugom mjestu i prenijeti na svaki metoda. Međutim, tijelo za-petlja se izravno generira kao bytecode na svom mjestu pojavljivanja. Ne primjenjuju se posebna pravila o opsegu.

10. Rukovanje iznimkama

Velika je razlika u tome što se postupanje s provjerenim iznimkama ne provodi.

Da bismo se nosili s općim iznimkama, potencijalni kod koji uzrokuje iznimke možemo smjestiti u pokušaj uhvatiti blok:

pokušajte {someActionThatWillThrowAnException ()} catch (e) // prijavite poruku pogreške i / ili obradite na neki način}

Ako ne prijavimo vrstu iznimke koju uhvatimo, ovdje će se uhvatiti svaka iznimka.

11. Zatvaranja

Jednostavno rečeno, zatvaranje je anonimni blok izvršnog koda koji se može proslijediti varijablama i ima pristup podacima u kontekstu u kojem je definiran.

Također su slični anonimnim unutarnjim klasama, iako ne implementiraju sučelje ili proširuju osnovnu klasu. Slični su lambdama u Javi.

Zanimljivo je da Groovy može u potpunosti iskoristiti JDK dodatke koji su uvedeni za podršku lambdama, posebno streaming API-ju. Uvijek se možemo koristiti zatvaračima tamo gdje se očekuju lambda izrazi.

Razmotrimo primjer u nastavku:

def helloWorld = {println "Pozdrav svijetu"}

Varijabla Pozdrav svijete sada sadrži referencu na zatvaranje, a mi ga možemo izvršiti pozivajući njegov poziv metoda:

helloWorld.call ()

Groovy nam dopušta upotrebu prirodnije sintakse poziva metode - ona poziva na poziv metoda za nas:

Pozdrav svijete()

11.1. Parametri

Kao i metode, zatvaranja mogu imati parametre. Postoje tri varijante.

U potonjem primjeru, jer ne postoji ništa declpersistence_startared, postoji samo jedan parametar sa zadanim imenom to. Izmijenjeno zatvaranje koje ispisuje ono što je poslano bilo bi:

def printTheParam = {ispisati}

Mogli bismo to nazvati ovako:

printTheParam ('zdravo') printTheParam 'zdravo'

Također možemo očekivati ​​parametre u zatvaračima i prosljeđivati ​​ih prilikom pozivanja:

def power = {int x, int y -> return Math.pow (x, y)} println power (2, 3)

Definicija tipa parametara jednaka je varijablama. Ako definiramo tip, možemo koristiti samo ovaj tip, ali možemo ga i proslijediti u bilo što što želimo:

def say = {what -> println what} recite "Hello World"

11.2. Po želji povratak

Posljednja izjava o zatvaranju može se implicitno vratiti bez potrebe za pisanjem izjave o vraćanju. To se može koristiti za smanjenje šifre pločice na minimum. Stoga se zatvarač koji izračunava kvadrat broja može skratiti kako slijedi:

def square = {it * it} println kvadrat (4)

Ovo zatvaranje koristi implicitni parametar to i neobavezna izjava o povratu.

12. Zaključak

Ovaj je članak pružio brz uvod u jezik Groovy i njegove ključne značajke. Počeli smo s uvođenjem jednostavnih pojmova kao što su osnovna sintaksa, uvjetni izrazi i operatori. Također smo pokazali neke naprednije značajke poput operatora i zatvaranja.

Ako želite pronaći više informacija o jeziku i njegovoj semantici, možete otići izravno na službenu stranicu.


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