Download - Introduction to Groovy
![Page 1: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/1.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Introduction to Groovy
![Page 2: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/2.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.02
About the Speaker
• Java developer since 1996• Fell in love with Groovy on July 2006 because
sometimes Java got in the way• Groovy committer since Aug 2007• Eclipse user since 2004
![Page 3: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/3.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.03
Agenda
• What is Groovy• From Java to Groovy• Feature List I (close to home)• Feature List II (explore the neighborhood)• Feature List III (space out!)• Eclipse & Groovy
![Page 4: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/4.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.04
What is Groovy?
• Groovy is an agile and dynamic language for the Java Virtual Machine
• Builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby & Smalltalk
• Makes modern programming features available to Java developers with almost-zero learning curve
• Supports Domain Specific Languages and other compact syntax so your code becomes easy to read and maintain
![Page 5: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/5.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.05
What is Groovy?
• Increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications
• Simplifies testing by supporting unit testing and mocking out-of-the-box
• Seamlessly integrates with all existing Java objects and libraries
• Compiles straight to Java byte code so you can use it anywhere you can use Java
![Page 6: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/6.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
From Java to Groovy
![Page 7: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/7.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.07
HelloWorld in Javapublic class HelloWorld { String name;
public void setName(String name) { this.name = name; } public String getName(){ return name; }
public String greet() { return “Hello “+ name; }
public static void main(String args[]){ HelloWorld helloWorld = new HelloWorld() helloWorld.setName(“Groovy”) System.err.println( helloWorld.greet() ) }}
![Page 8: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/8.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.08
HelloWorld in Groovypublic class HelloWorld { String name;
public void setName(String name) { this.name = name; } public String getName(){ return name; }
public String greet() { return “Hello “+ name; }
public static void main(String args[]){ HelloWorld helloWorld = new HelloWorld() helloWorld.setName(“Groovy”) System.err.println( helloWorld.greet() ) }}
![Page 9: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/9.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.09
Step1: Let’s get rid of the noise
• Everything in Groovy is public unless defined otherwise.
• Semicolons at end-of-line are optional.
![Page 10: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/10.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.010
Step 1 - Resultsclass HelloWorld { String name
void setName(String name) { this.name = name } String getName(){ return name }
String greet() { return "Hello "+ name }
static void main(String args[]){ HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") System.err.println( helloWorld.greet() ) }}
![Page 11: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/11.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.011
Step 2: let’s get rid of boilerplate
• Programming a JavaBean requires a pair of get/set for each property, we all know that. Let Groovy write those for you!
• Main( ) always requires String[ ] as parameter. Make that method definition shorter with optional types!
• Printing to the console is so common, can we get a shorter version too?
![Page 12: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/12.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.012
Step2 - Resultsclass HelloWorld { String name
String greet() { return "Hello "+ name }
static void main( args ){ HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") println( helloWorld.greet() ) }}
![Page 13: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/13.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.013
Step 3: Introduce dynamic types
• Use the def keyword when you do not care about the type of a variable, think of it as the var keyword in JavaScript.
• Groovy will figure out the correct type, this is called duck typing.
![Page 14: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/14.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.014
Step3 - Resultsclass HelloWorld { String name
def greet() { return "Hello "+ name }
static def main( args ){ def helloWorld = new HelloWorld() helloWorld.setName("Groovy") println( helloWorld.greet() ) }}
![Page 15: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/15.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.015
Step 4 : Use variable interpolation
• Groovy supports variable interpolation through GStrings (seriously, that is the correct name!)
• It works as you would expect in other languages.• Prepend any Groovy expression with ${} inside a
String
![Page 16: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/16.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.016
Step 4 - Resultsclass HelloWorld { String name
def greet(){ return "Hello ${name}" }
static def main( args ){ def helloWorld = new HelloWorld() helloWorld.setName("Groovy") println( helloWorld.greet() ) }}
![Page 17: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/17.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.017
Step 5: Let’s get rid of more keywords
• The return keyword is optional, the return value of a method will be the last evaluated expression.
• You do not need to use def in static methods
![Page 18: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/18.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.018
Step 5 - Resultsclass HelloWorld { String name
def greet(){ "Hello ${name}" }
static main( args ){ def helloWorld = new HelloWorld() helloWorld.setName("Groovy") println( helloWorld.greet() ) }}
![Page 19: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/19.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.019
Step 6: POJOs on steroids
• Not only do POJOs (we call them POGOs in Groovy) write their own property accessors, they also provide a default constructor with named parameters (kind of).
• POGOs support the array subscript (bean[prop]) and dot notation (bean.prop) to access properties
![Page 20: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/20.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.020
Step 6 - Resultsclass HelloWorld { String name
def greet(){ "Hello ${name}" }
static main( args ){ def helloWorld = new HelloWorld(name:"Groovy") helloWorld.name = "Groovy" helloWorld["name"] = "Groovy" println( helloWorld.greet() ) }}
![Page 21: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/21.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.021
Step 7: Groovy supports scripts
• Even though Groovy compiles classes to Java byte code, it also supports scripts, and guess what, they are also compile down to Java byte code.
• Scripts allow classes to be defined anywhere on them.• Scripts support packages, after all they are also valid
Java classes.
![Page 22: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/22.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.022
Step 7 - Results
class HelloWorld {
String name
def greet() { "Hello $name" }
}
def helloWorld = new HelloWorld(name:"Groovy")
println helloWorld.greet()
![Page 23: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/23.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.023
We came from here…public class HelloWorld { String name;
public void setName(String name) { this.name = name; } public String getName(){ return name; }
public String greet() { return "Hello "+ name; }
public static void main(String args[]){ HelloWorld helloWorld = new HelloWorld() helloWorld.setName("Groovy") System.err.println( helloWorld.greet() ) }}
![Page 24: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/24.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.024
… to here
class HelloWorld {
String name
def greet() { "Hello $name" }
}
def helloWorld = new HelloWorld(name:"Groovy")
println helloWorld.greet()
![Page 25: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/25.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Feature List IClose to home
![Page 26: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/26.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.026
Follow the mantra…
Java is Groovy, Groovy is Java
• Flat learning curve for Java developers, start with straight Java syntax then move on to a groovier syntax as you feel comfortable.
• Almost 98% Java code is Groovy code, meaning you can in most changes rename *.java to *.groovy and it will work.
![Page 27: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/27.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.027
Common gotchas from Java to groovy
• Native syntax for Lists and Maps.
• Java Array initializers are not supported, but lists can be coerced into arrays.
• Inner class definitions are not supported yet.
![Page 28: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/28.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.028
Feature List I – JDK5
• Groovy supports jsr 175 annotations (same as Java), in fact it is the second language on the Java platform to do so.
Annotation definitions can not be written in Groovy (yet).
• Groovy supports Enums too There is still work to do in terms of fancier syntax.
• Initial generics support
![Page 29: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/29.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.029
Feature List I – JDK5
• Varargs can be declared as in Java (with the triple dot notation) or through a convention:
if the last parameter of a method is of type Object[ ] then varargs may be used.
![Page 30: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/30.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.030
Varargs in actionclass Calculator { def addAllGroovy( Object[] args ){ int total = 0 for( i in args ) { total += i } total } def addAllJava( int... args ){ int total = 0 for( i in args ) { total += i } total }}
Calculator c = new Calculator()assert c.addAllGroovy(1,2,3,4,5) == 15assert c.addAllJava(1,2,3,4,5) == 15
![Page 31: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/31.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Feature List IIExplore the Neighborhood
![Page 32: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/32.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.032
Assorted goodies
• Default parameter values as in PHP• Named parameters as in Ruby (reuse the Map trick of
default POGO constructor)• Operator overloading, using a naming convention, for
example
+ plus()
[ ] getAt() / putAt()
<< leftShift()
![Page 33: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/33.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.033
Closures
• Closures can be seen as reusable blocks of code, you may have seen them in JavaScript and Ruby among other languages.
• Closures substitute inner classes in almost all use cases.
• Groovy allows type coercion of a Closure into a one-method interface
• A closure will have a default parameter named it if you do not define one.
![Page 34: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/34.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.034
Examples of closuresdef greet = { name -> println “Hello $name” }greet( “Groovy” )// prints Hello Groovy
def greet = { println “Hello $it” }greet( “Groovy” )// prints Hello Groovy
def iCanHaveTypedParametersToo = { int x, int y -> println “coordinates are ($x,$y)”}
def myActionListener = { event -> // do something cool with event} as ActionListener
![Page 35: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/35.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.035
With closures comes currying
• Currying is a programming technique that transforms a function into another while fixing one or more input values (think constants).
![Page 36: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/36.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.036
Currying in action// a closure with 3 parameters, the third one is optional// as it defines a default valuedef getSlope = { x, y, b = 0 -> println "x:${x} y:${y} b:${b}" (y - b) / x}
assert 1 == getSlope( 2, 2 )def getSlopeX = getSlope.curry(5)assert 1 == getSlopeX(5)assert 0 == getSlopeX(2.5,2.5)// prints// x:2 y:2 b:0// x:5 y:5 b:0// x:5 y:2.5 b:2.5
![Page 37: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/37.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.037
Iterators everywhere
• As in Ruby you may use iterators in almost any context, Groovy will figure out what to do in each case
• Iterators harness the power of closures, all iterators accept a closure as parameter.
• Iterators relieve you of the burden of looping constructs
![Page 38: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/38.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.038
Iterators in actiondef printIt = { println it }// 3 ways to iterate from 1 to 5[1,2,3,4,5].each printIt1.upto 5, printIt(1..5).each printIt
// compare to a regular loopfor( i in [1,2,3,4,5] ) printIt(i)// same thing but use a Rangefor( i in (1..5) ) printIt(i)
[1,2,3,4,5].eachWithIndex { v, i -> println "list[$i] => $v" }// list[0] => 1// list[1] => 2// list[2] => 3// list[3] => 4// list[4] => 5
![Page 39: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/39.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Feature List IIISpace out!
![Page 40: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/40.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.040
The as keyword
• Used for “Groovy casting”, convert a value of typeA into a value of typeBdef intarray = [1,2,3] as int[ ]
• Used to coerce a closure into an implementation of single method interface.
• Used to coerce a Map into an implementation of an interface, abstract and/or concrete class.
• Used to create aliases on imports
![Page 41: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/41.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.041
Some examples of asimport javax.swing.table.DefaultTableCellRenderer as DTCR
def myActionListener = { event -> // do something cool with event} as ActionListener
def renderer = [ getTableCellRendererComponent: { t, v, s, f, r, c -> // cool renderer code goes here }] as DTCR
// note that this technique is like creating objects in// JavaScript with JSON format// it also circumvents the fact that Groovy can’t create// inner classes (yet)
![Page 42: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/42.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.042
New operators
• ?: (elvis) - a refinement over the ternary operator
• ?. Safe dereference – navigate an object graph without worrying on NPEs
• <=> (spaceship) – compares two values
• * (spread) – “explode” the contents of a list or array
• *. (spread-dot) – apply a method call to every element of a list or array
![Page 43: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/43.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.043
Traversing object graphs
• GPath is to objects what XPath is to XML.
• *. and ?. come in handy in many situations
• Because POGOs accept dot and bracket notation for property access its very easy to write GPath expressions.
![Page 44: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/44.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.044
Sample GPath expressionsclass Person { String name int id}
def persons = [ new Person( name: 'Duke', id: 1 ), [name: 'Tux', id: 2] as Person]
assert [1,2] == persons.idassert ['Duke','Tux'] == persons*.getName()assert null == persons[2]?.nameassert 'Duke' == persons[0].name ?: 'Groovy'assert 'Groovy' == persons[2]?.name ?: 'Groovy'
![Page 45: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/45.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.045
MetaProgramming
• You can add methods and properties to any object at runtime.
• You can intercept calls to method invocations and/or property access (similar to doing AOP but without the hassle).
• This means Groovy offers a similar concept to Ruby’s open classes, Groovy even extends final classes as String and Integer with new methods (we call it GDK).
![Page 46: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/46.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.046
A simple example using categories
class Pouncer { static pounce( Integer self ){ def s = “Boing!" 1.upto(self-1) { s += " boing!" } s + "!" }}
use( Pouncer ){ assert 3.pounce() == “Boing! boing! boing!"}
![Page 47: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/47.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.047
Same example using MetaClassesInteger.metaClass.pounce << { -> def s = “Boing!" delegate.upto(delegate-1) { s += " boing!" } s + "!“}
assert 3.pounce() == “Boing! boing! boing!"
![Page 48: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/48.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Eclipse & Groovy
![Page 49: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/49.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.049
Eclipse Plugin
• Allows you to edit, compile and run groovy scripts and classes.
• Syntax coloring• Autocompletion• Groovy nature• Great support from Eclipse 3.2 series
![Page 50: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/50.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.050
How to install
1. Go to Help -> Software Updates -> Find and Install
2. Configure a new update sitehttp://dist.codehaus.org/groovy/distributions/update/
3. Follow the wizard instructions
4. Restart Eclipse. You are now ready to start Groovying!
![Page 51: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/51.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.051
![Page 52: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/52.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.052
![Page 53: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/53.jpg)
Introduction to Groovy | © 2008 by «Andres Almiray»; made available under the EPL v1.053
Resources
• Groovy Language, guides, examples http://groovy.codehaus.org
• Groovy Eclipse Plugin http://groovy.codehaus.org/Eclipse+Plugin
• Groovy Related News http://aboutgroovy.com http://groovyblogs.org http://groovy.dzone.com
• My own Groovy/Java/Swing blog http://jroller.com/aalmiray
![Page 54: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/54.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Q&A
![Page 55: Introduction to Groovy](https://reader036.vdocument.in/reader036/viewer/2022062315/56814deb550346895dbb59b4/html5/thumbnails/55.jpg)
© 2008 by «Andres Almiray»; made available under the EPL v1.0 | 03/17/2008
Thank you!