GROOVY, une surcouche de Java

Maxime Prost
Ecosystèmes des langages de programmation
3 min readJun 26, 2017

Groovy est un langage de script. Ce projet est open-source et a été commencé en 2003. Ce langage s’inspire notamment de Python, Ruby et Smalltalk ; c’est un langage orienté objet pour la plate-forme Java. L’intérêt de Groovy repose dans sa syntaxe simplifiée ainsi que dans les multiples modules et builders. Groovy permet d’avoir avec le code Java existant une intégration cohérente et de s’interfacer avec toutes les applications Java. Groovy étant une surcouche de Java il engendre du bytecode Java.

Syntaxe

On pourra noter comme différences avec Java :

• C’est un langage très souple, en effet en fin de ligne le point-virgule est facultatif de même que la déclaration du type des variables.

  • La déclaration des tableaux est différente.

Dans quel but ?

Groovy peut utiliser les bibliothèques Java et être utilisé dans les classes Java.

Ce langage est capable d’interagir avec une base de données.

Une des caractéristiques les plus importantes de Groovy est qu’il peut gérer nativement les langages de balisage tel que XML et HTML. Cela permet d’utiliser une syntaxe commune pour manipuler différents types de strucutres.

Une fonctionnalitée particulièrement intéressante: la closure

En GROOVY, une closure est un bloc de code qui peut prendre des arguments retourner des valeurs et être assigné à une variable, un peu comme une fonction sauf que ce bloc de code est anonyme.

exemple de closure en GROOVY:

def isOdd = { int i -> i%2 != 0 }                           
assert isOdd(3) == true
assert isOdd(2) == false
def isEven = { it%2 == 0 }
assert isEven(3) == false
assert isEven(2) == true

Ici isOdd et isEven sont des closures, ce sont des portions de codes stockées qui ne sont exécutées que lorsqu’elles sont appelées et qui peuvent utilisé des variables déclarées dans le code parent.

Contrairement à la définition formelle des closures, les closures de GROOVY supportent les “free variables”, ce sont des variables qui n’ont pas été explicitement passées en argument, mais existe dans la déclaration de la closure. Ceci est contraire au paradigme des langages formels. Le fait de briser ce concept formel apportent un certain nombre d’avantages :

  • La conversion des closures en interfaces ou en méthodes en utilisant l’opérateur as par exemple comme ci-dessous.
Predicate filter = { it.contains ‘G’ } as Predicate 
assert filter.accept(‘Groovy’) == true
  • Un currying différent des autres langages fonctionnels : GROOVY permet d’assigner une valeur a un paramètre d’une closure et cela va retourner une closure avec un argument en moins.
//ceci est une closure ayant deux paramètres.
def nCopies = { int n, String str -> str*n }
//la closure nCopie place le premier paramètre à 2 créant ainsi une nouvelle closure avec un seul paramètre.
def twice = nCopies.curry(2)
//on appel la closure précédemment créée et on place son seul paramètre.
assert twice('bla') == 'blabla'
//elle est maintenant équivalente à la closure nCopies appelée avec deux paramètres.
assert twice('bla') == nCopies(2, 'bla')
  • la Memoization qui permet d’attraper le résultat de l’appel d’une closure. Cela permet d’accélérer fortement la vitesse d’exécution de closures récursives. Un bon exemple est le calcul de la suite de Fibonacci :
def fib
fib = { long n -> n<2?n:fib(n-1)+fib(n-2) }
assert fib(15) == 610 // lent!
//contre
fib = { long n -> n<2?n:fib(n-1)+fib(n-2) }.memoize()
assert fib(25) == 75025 // rapide!
  • La composition qui permet de créer une nouvelle closure à partir de closure existante.
def plus2  = { it + 2 }
def times3 = { it * 3 }

def times3plus2 = plus2 << times3
assert times3plus2(3) == 11

Conclusion

Les possibilités offertes en utilisant Groovy sont nombreuses. Ce langage peut être utilisé afin de

  • Faire du développement rapide
  • Utiliser les langages balises
  • Réaliser des tests
  • Ou bien encore la réalisation d’application financière

Attention toutefois Groovy est un outils très puissant qui nécessite beaucoup de temps pour l’appréhender.

Pour les plus curieux voici la liste de quelques modules intéressants : Grails , GFreeMarker , GSQL , GORM, GroovyWS

--

--