2010-11-24 3 views
30

En tant que programmeur Java, je n'ai pas vraiment d'arrière-plan Groovy, mais j'utilise beaucoup Groovy dernièrement pour étendre Maven (en utilisant GMaven). Jusqu'à présent, je pouvais utiliser tout le code Java dont j'ai besoin dans Groovy avec le sucre Groovy ajouté (méthodes de métaclasse, plus d'opérateurs, fermetures). Ma connaissance de Groovy est loin d'être complète, mais je l'aime, surtout à des fins de script (je suis un peu prudent sur l'utilisation d'un langage typé non statique dans un scénario d'entreprise, mais ce n'est pas le sujet ici).La syntaxe Groovy est-elle un surensemble exact de la syntaxe Java?

Quoi qu'il en soit, la question est:

est tout de code Java valide automatiquement valide le code Groovy? (Je parle de code source, pas de classes compilées, je sais que Groovy peut interagir avec des classes Java.) Ou y a-t-il des constructions Java qui sont illégales dans Groovy? Peut-être un mot-clé Groovy réservé qui pourrait être utilisé comme identifiant en Java, ou autre chose? Ou est-ce que Groovy a été délibérément conçu pour être compatible avec Java à 100%?

+1

duplication possible de [code Java valide qui n'est pas valide code Groovy?] (http://stackoverflow.com/questions/687601/valid-java-code-that-is-not-valid -groovy-code) –

+1

@Michael Je suis d'accord que c'est une dupe, mais l'autre question est plus d'un an (au moins groovy a vu des mises à jour importantes depuis lors). Existe-t-il une politique générale sur la durée de validité des questions? –

+0

Copie possible de [Groovy Superset de Java] (http://stackoverflow.com/questions/1959165/groovy-superset-of-java) – starcorn

Répondre

15

Ce n'est pas le cas.

Mon incompatibilité préférée: tableaux littéraux:

String[] s = new String[] {"a", "b", "c"}; 

En Groovy, les accolades dans ce contexte serait censé contenir une fermeture, pas un tableau littéral.

+2

Et la version groovy serait 'String [] s = [" un "," b "," c "];'? –

+0

Y at-il un – Rekin

+2

^^ Presque la syntaxe [] crée une liste, mais c'est si vous ajoutez "as String []" à la fin de la ligne –

19

Non. Les éléments suivants sont des mots-clés dans groovy, mais pas Java:

any as  def in  with 

De plus, sans mots-clés, delegate et owner ont une signification particulière dans les fermetures et peuvent vous faire trébucher si vous ne faites pas attention.

En outre, il existe quelques différences mineures dans la syntaxe du langage. D'une part, Java est plus flexible sur l'endroit où les accolades de tableau se produisent dans les déclarations:

public static void main(String args[]) // valid java, error in groovy 

Groovy est analysé différemment aussi. Voici un exemple:

public class Test { 
    public static void main(String[] args) { 
     int i = 0; 
     i = 5 
     +1; 
     System.out.println(i); 
    } 
} 

Java imprimera 6, groovy imprimera 5.

Alors que groovy est source de la plupart du temps compatible avec java, il y a beaucoup de cas de coin qui ne sont pas les mêmes. Cela dit, il est très compatible avec le code que les gens écrivent réellement.

+1

Ah, instruction de fin de ligne (source de nombreux bugs horribles, par exemple en JavaScript). Merci pour l'indice (+1) –

+5

La notation 'String args []' en Java est horrible (elle me rappelle toutes les choses que je déteste à propos de C). Heureux d'entendre Groovy n'a pas ça. –

+0

La notation 'String [] args' en Java est horrible (cela me rappelle tout ce que je déteste à propos de Java). Dommage aussi voir Groovy ne supporte pas l'autre sens ... :( – paulotorrens

11

Il y a a page on the Groovy site qui documente quelques-unes des différences et another page which lists gotchas (comme la chose newline)

Il y a d'autres choses aussi, un exemple étant que Groovy ne supporte pas la do...while boucle construire

+3

Merci. * un exemple étant que Groovy ne supporte pas le do ... while looping construct * bonne chose aussi. Je commence à avoir l'impression que Groovy a pris toutes les bonnes choses de Java et a omis toutes les choses horribles. Ce qui soulève la question évidente: Groovy a-t-il des étiquettes en boucle? –

+0

Ouais, les étiquettes de boucle sont là, donc «continuer l'étiquette» ou «étiquette de rupture» sont valides Groovy –

5

D'autres ont déjà donné des exemples de syntaxe Java illégale dans Groovy (par exemple les tableaux littéraux). Il est également utile de rappeler qu'une certaine syntaxe qui est légale dans les deux langues ne signifie pas la même chose dans les deux langues. Par exemple, en Java:

foo == bar 

des tests d'identité, à savoir ne foo et bar se réfèrent tous deux au même objet? Dans Groovy, ceci teste l'égalité d'objet, c'est-à-direrenvoie le résultat de foo.equals(bar)

+1

Je sais, et c'est une caractéristique terrible de mon humble avis. Heureusement, je ne m'appuie presque jamais sur Java en Java (pour les non-primitifs) et je ne ferai donc pas non plus cette erreur dans Groovy. –

+8

Je ne suis pas d'accord. Je pense que c'est une bonne fonctionnalité. Le test de l'égalité est le cas le plus courant et ne repose pas sur le concept d'identité pas si intuitif. De plus, les auteurs d'objets en ont le contrôle en remplaçant la méthode 'equals()'. Le test de l'identité est rigidement défini par le langage et expose des inconsistances java laides comme 'new Long (1)! = New Long (1)' mais 'Long.valueOf (1) == Long.valueOf (1)'. Groovy fait que le "bon" cas utilise un opérateur (lisible, intuitif) et le "mauvais" cas utilise un appel de méthode (le signalant comme une exception à prendre en compte). Java fait l'inverse. – ataylor