Groovy: una bella scoperta

Studiare un nuovo linguaggio di programmazione è sempre stimolante, soprattutto se ci aiuta a ragionare su modi nuovi e migliori di scrivere codice.

Negli ultimi anni una miriade di nuovi linguaggi è nata e ha raggiunto la maturità; basti pensare a Python, Ruby, Go, per citarne alcuni. Ognuno di essi introduce interessanti novità e costrutti sempre più efficienti.

È giunto dunque il momento di abbandonare Java e migrare verso qualcosa di più “giovane”?

Forse sì… O forse è possibile affiancare al caro Java qualcosa di più “fresco”, qualcosa che sopperisca alle annose mancanze e curi i primi “acciacchi della vecchiaia”.

Con un po’ di ritardo, tempo fa ho deciso di dare una seconda possibilità a Groovy, linguaggio che avevo già preso in esame alcuni anni fa, ma che allora (lo ammetto) non mi aveva pienamente convinto.

In questo post vi racconto cosa ho scoperto di nuovo e vi spiego perché, secondo me, ogni programmatore Java dovrebbe conoscere anche Groovy.

Cos’è Groovy

Apache Groovy è comunemente descritto come un linguaggio dinamico, orientato agli oggetti, basato sulla piattaforma Java (ma è difficile dare una definizione univoca di questo linguaggio, date le sue tante sfaccettature).

Cosa significa “linguaggio dinamico”?

Significa che con Groovy, se necessario, possiamo scrivere codice che modifica il suo stesso comportamento a runtime. Il linguaggio implementa infatti meccanismi di meta-programmazione che fanno largo uso della reflection.

Cosa vuol dire “basato sulla piattaforma Java”?

L’obiettivo originario di Groovy, ideato nel 2003 da James Strachan, era quello di creare un linguaggio che estendesse/integrasse il Java con quanto di innovativo era stato introdotto da linguaggi come Python e Ruby.

La completa compatibilità con la JVM e con il linguaggio Java ha rappresentato dunque, fin da subito, uno dei principi che hanno guidato lo sviluppo del linguaggio.

Ma non finisce qui…

Groovy è anche un linguaggio funzionale e supporta nativamente il concetto di closure).

Groovy è dynamically typed (ma anche no…): la definizione ufficiale è optionally typed, ovvero, la sua natura dinamica fa sì che i tipi vengano valutati a runtime, ma opzionalmente è possibile abilitare la tipizzazione statica.

Groovy è un linguaggo di scripting (ma anche compilato). Possiamo decidere di compilare il nostro codice nei classici file .class utilizzando il compilatore groovyc o di utilizzare l’interprete groovy per eseguire direttamente i nostri script.

Insomma, Groovy raccoglie tante caratteristiche interessanti e le fa sue; caratteristiche che rendono questo linguaggio uno strumento estremamente potente e versatile.

Perché ogni sviluppatore Java dovrebbe conoscere Groovy

Se quello che vi ho raccontato nel paragrafo precedente vi ha incuriosito, sappiate che, per chi lavora con Java la faccenda è ancora più interessante… :-)

Di seguito vi riporto tre aspetti che, personalmente, ho trovato molto convincenti.

  • Piena integrazione tra Java e Groovy. Come già detto, Groovy nasce per essere compatibile con la piattaforma Java; possiamo dunque dichiarare classi Groovy all’interno dei nostri progetti Java senza alcun pericolo di “rigetto”. Tutto il codice sarà compilato in Java bytecode e sarà del tutto indistinguibile per la JVM. Inoltre, se lavorate con Spring forse sarete contenti di sapere che il framework supporta pienamente Groovy.

  • Curva di apprendimento (praticamente) piatta per chi già padroneggia il linguaggio Java. La maggior parte del codice scritto in Java rimane sintatticamente corretto anche in Groovy; esistono però piccole differenze tra i due linguaggi (meglio conoscerle da subito).

  • Espressività del codice e semplificazione. Uno degli aspetti che mi ha maggiormente stupito durante i miei primi esperimenti con Groovy è l’incredibile espressività di questo linguaggio. Groovy si presenta come una versione “rinnovata” di Java: più giovane, intuitiva e meno verbosa.

Qualche esempio…

Groovy punta tutto sulla brevità del codice, rendendo opzionali molti degli elementi tipici con i quali siamo abituati a lavorare in Java. Prendiamo ad esempio la seguente classe:

class UnaClasse {
  int numero
  String testo

  String metodo(arg){
    "una stringa"
  }
}

Alcuni dettagli da notare:

  • non è richiesto il punto e virgola alla fine di un’istruzione;
  • è possibile omettere i modificatori di accesso: di default le classi saranno public, mentre i membri saranno private;
  • è possibile omettere la parola chiave return: in ogni caso verrà ritornato il valore dell’ultima espressione nel metodo;
  • è possibile omettere il tipo dei parametri di un metodo;
  • i metodi di accesso (setter e getter) sono generati automaticamente per tutti i campi private;
  • non è strettamente necessario definire costruttori per la classe, sarà infatti possibile utilizzare i named parameters nel costruttore di default per istanziare un nuovo oggetto.

Il GDK (Groovy Development Kit) costituisce un’estensione del Java Development Kit ed aggiunge nuove classi di supporto e nuove funzionalità alle classi già esistenti.

Troviamo ad esempio il supporto nativo per liste, mappe e range sulle quali possiamo operare in maniera molto più intuitiva di quanto siamo abituati con Java.

Per dichiarare una collection ci basterà scrivere qualcosa di simile:

def lista = [2, 4, 6]
def mappa = ["uno" : 1, "due" : 2, "tre" : 3]

Per accedere ad un elemento della collection:

def ilSecondo = lista[1]
def ilTre = mappa["tre"]

Per trasformare in “tutto-maiuscole” le stringhe di una lista:

["Tizio", "Caio", "Sempronio"]*.toUpperCase()

E questa è solo la punta dell’iceberg… :-)

In conclusione

Groovy dimostra decisamente di essere un ottimo linguaggio, capace di portare una ventata d’innovazione nello sviluppo in ambiente Java. Per quanto mi riguarda, rimango però molto cauto nel considerarlo un valido sostituto del Java.

Benché framework come Grails ci dimostrano che è possibile sviluppare applicazioni complesse interamente scritte in Groovy, personalmente trovo più utile l’impiego di questo linguaggio in contesti più “ristretti”, come la creazione di script di supporto, l’implementazione di piccole applicazioni o di moduli all’interno di progetti Java più complessi.

Avremo modo di riparlare di questo linguaggio in futuri post e di vederlo in azione più da vicino. Per il momento vi consiglio di curiosare tra la corposa documentazione presente sul sito ufficiale.

A presto,

David