Whats New In Groovy 1.6?

  • 1,041 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,041
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
21
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. What’s new in Groovy 1.6? Guillaume Laforge Groovy Project Manager / SpringSource
  • 2. Guillaume Laforge Groovy Project Manager — SpringSource > Working on Groovy since 2003 > JSR-241 Spec Lead > Initiator of the Grails web framework > Co-author of Groovy in Action > Speaker: JavaOne, QCon, JavaPolis/Devoxx, JavaZone, Sun Tech Days, SpringOne/The Spring Experience, JAX, DSL DevCon, and more… 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 2 2
  • 3. What’s new in Groovy 1.6? Article Published by InfoQ > This presentation was prepared with the examples I’ve used in my article written for InfoQ > http://www.infoq.com/articles/groovy-1-6 > Read this article for more detailed explanations of all the new features in Groovy 1.6 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 3 3
  • 4. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 4 4
  • 5. Groovy in a Nutshell Simplify the Life of Java Developers > Groovy is a dynamic language for the Java Virtual Machine  With a Meta-Object Protocol  Compiles down to bytecode > Open Source Apache licensed project > Relaxed grammar derived from the Java 5 grammar  Borrowed some good ideas from Smalltalk/Python/Ruby  Java 5 features out of the box: annotations, generics, static imports, enums…  Flat learning curve 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 5 5
  • 6. Features at a Glance Lots More Than This! > Fully Object-Oriented > Joint compiler: seamless Java integration > Closures: reusable blocks of code / anonymous functions > Properties: forget about getters and setters > Optional typing: your choice! > BigDecimal arithmetic by default for floating point > Handy APIs  XML, JDBC, JMX, template engine, Swing UIs > Strong ability for authoring Domain-Specific Languages  Syntax-level “builders”  Adding properties to numbers: 10.dollars  Operator overloading: 10.meters + 20.kilometers 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 6 6
  • 7. A Taste of Groovy — Take 1 A Normal Java Program > public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot; + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(quot;Groovyquot;); System.out.println( helloWorld.greet() ); } } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 7 7
  • 8. A Taste of Groovy — Take 2 A Valid Groovy Program > public class HelloWorld { private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } public String greet() { return quot;Hello quot; + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(quot;Groovyquot;); System.out.println( helloWorld.greet() ); } } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 8 8
  • 9. A Taste of Groovy — Take 3 A Groovier Program! > class HelloWorld { String name String greet() { quot;Hello $namequot; } } def helloWorld = new HelloWorld(name: quot;Groovyquot;) println helloWorld.greet() 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 9 9
  • 10. The Groovy Web Console A Groovy Playground > Groovy works nicely on Google App Engine  You can also deploy Grails applications > You can play with Groovy in the web console  http://groovyconsole.appspot.com/ 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 10 10
  • 11. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 11 11
  • 12. Performance Improvements Both Runtime & Compile-Time > The Groovyc compiler is 3x to 5x faster  With a clever class lookup cache > Certain online micro-benchmarks show 150% to 460% increase in performance compared to Groovy 1.5  Thanks to advanced call-site caching techniques  Beware of micro-benchmarks! > Makes Groovy one of the fastest dynamic languages available 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 12 12
  • 13. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 13 13
  • 14. Multiple Assignment Assign Multiple Variables at Once > Newly defined variables  def (a, b) = [1, 2] assert a == 1 assert b == 2 > Assign to existing variables  def lat, lng (lat, lng) = geocode(‘Paris’) > The classical swap case  (a, b) = [b, a] > Extra elements ⇒ not assigned to any variable > Less elements ⇒ null into extra variables 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 14 14
  • 15. More Optional Return In if/else and try/catch Blocks > The return keyword is optional for the last expression of a method body  But if/else & try/catch didn’t return any value > def method() { if (true) 1 else 0 } assert method() == 1 > def method(bool) { try { if (bool) throw new Exception(quot;fooquot;) 1 } catch(e) { 2 } finally { 3 } } assert method(false) == 1 assert method(true) == 2 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 15 15
  • 16. Annotation Definition The Missing Bit of Java 5 Support > Groovy support for Java 5 features is now complete with the missing annotation definition > Nothing to show here, it’s just normal Java :-) > Note that the sole dynamic language supporting annotation is… Groovy  Opens the door to EJB3 / JPA / Spring annotations / Guice / TestNG… 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 16 16
  • 17. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 17 17
  • 18. Meta-What? Meta-Programming > The ability of a language to modify itself > Groovy 1.6 introduces AST Transformations  Abstract Syntax Tree > Goodbye to a lot of boiler-plate technical code! > Two kinds of transformations  Global transformations  Local transformations: triggered by annotations 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 18 18
  • 19. AST Transformations in Groovy 1.6 Implement Patterns through Transformations > Several transformations finds their way  @Singleton — okay, not really a pattern ;-)  @Immutable, @Lazy, @Delegate  @Newify  @Category and @Mixin  @PackageScope  Swing’s @Bindable and @Vetoable  Grape’s @Grab > Let’s have a look at some of them! 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 19 19
  • 20. @Singleton (Anti-)Pattern Revisited > The evil Java singleton  public class Evil { public static final Evil instance = new Evil (); private Evil () {} Evil getInstance() { return instance; } } > In Groovy:  @Singleton class Evil {} > There’s also a « lazy » version  @Singleton(lazy = true) class Evil {} 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 20 20
  • 21. @Immutable The Immutable… Boiler-Plate Code > To properly implement immutable classes  No mutators (state musn’t change)  Private final fields  Defensive copying of mutable components  Proper equals() / hashCode() / toString() for comparisons or for keys in maps, etc. > In Groovy  @Immutable final class Coordinates { Double lat, lng } def c1 = new Coordinates(lat: 48.8, lng: 2.5) def c2 = new Coordinates(48.8, 2.5) assert c1 == c2 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 21 21
  • 22. @Lazy Not Just for Lazy Dudes! > When you need to lazy evaluate / instantiate complex data structures for class fields, mark them as @Lazy  class Dude { @Lazy pets = retriveFromSlowDB() } > Groovy will handle the boiler-plate code for you 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 22 22
  • 23. @Delegate Not Just for Managers! > You can delegate to fields of your class  Think multiple inheritance  class Employee { def doTheWork() { quot;donequot; } } class Manager { @Delegate Employee slave = new Employee() } def god = new Manager() assert god.doTheWork() == quot;donequot; > Damn manager who will get all the praise… 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 23 23
  • 24. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 24 24
  • 25. Grab a Grape Groovy Advanced Packaging Engine > Helps you distribute scripts without dependencies > Just declare your dependencies with @Grab  Will look for dependencies in Maven or Ivy repositories > @Grab(group = 'org.mortbay.jetty', module = 'jetty-embedded', version = '6.1.0') def startServer() { def srv = new Server(8080) def ctx = new Context(srv , quot;/quot;, SESSIONS); ctx.resourceBase = quot;.quot; ctx.addServlet(GroovyServlet, quot;*.groovyquot;) srv.start() } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 25 25
  • 26. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 26 26
  • 27. @Bindable (1/2) Event-Driven Made Easy > Speaking of boiler-plate code… property change listeners > import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeListener; public class MyBean { private String prop; PropertyChangeSupport pcs = new PropertyChangeSupport(this); public void addPropertyChangeListener(PropertyChangeListener l) { pcs.add(l); } public void removePropertyChangeListener(PropertyChangeListener l) { pcs.remove(l); } public String getProp() { return prop; } public void setProp(String prop) { pcs.firePropertyChanged(quot;propquot;, this.prop, this.prop = prop); } } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 27 27
  • 28. @Bindable (2/2) Event-Driven Made Easy > Groovy’s solution  class MyBean { @Bindable String prop } > Interesting in Griffon and Swing builder  textField text: bind { myBean.prop } > Also of interest: @Vetoable 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 28 28
  • 29. Griffon The Swing MVC Framework > Leverages Groovy’s SwingBuilder and Grails’ infrastructure  http://griffon.codehaus.org > Don’t miss the Griffon BOF! 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 29 29
  • 30. Swing Console Improvements > The console can be run as an applet > Code indentation support > Script drag’n drop > Add JARs in the classpath from the GUI > Execution results visualization plugin > Clickable stacktraces and error messages > Not intended to be a full-blown IDE, but handy 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 30 30
  • 31. 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 31 31
  • 32. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 32 32
  • 33. ExpandoMetaClass DSL Less Repetition > EMC is a way to change the behavior of types at runtime > Before  Number.metaClass.multiply = { Amount amount -> amount.times(delegate) } Number.metaClass.div = { Amount amount -> amount.inverse().times(delegate) } > Now in Groovy 1.6  Number.metaClass { multiply { Amount amount -> amount.times(delegate) } div { Amount amount -> amount.inverse().times(delegate) } } 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 33 33
  • 34. Runtime Mixins Inject New Behavior to Types at Runtime > class FlyingAbility { def fly() { quot;I'm ${name} and I fly!quot; } } class JamesBondVehicle { String getName() { quot;James Bond's vehiclequot; } } JamesBondVehicle.mixin FlyingAbility assert new JamesBondVehicle().fly() == quot;I'm James Bond's vehicle and I fly!quot; 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 34 34
  • 35. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 35 35
  • 36. javax.script.* Scripting APIs Groovy Scripting Engine Built-In > In Groovy 1.6, the JSR-223 / javax.script.* scripting engine for Groovy is bundled  import javax.script.* def manager = new ScriptEngineManager() def engine = manager.getEngineByName(quot;groovyquot;) assert engine.evaluate(quot;2 + 3quot;) == 5 > To evaluate Groovy scripts at runtime in your application, just drop the Groovy JAR in your classpath! 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 36 36
  • 37. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 37 37
  • 38. JMX Builder (1/2) Domain-Specific Language for JMX > Simplify JMX handling with a Builder pattern approach > Declaratively expose Java/Groovy objects as MBeans > JMX's event model support  Inline closures to create event handler & broadcaster  Closures for receiving event notifications > Provides a flexible registration policy for MBean > Exposes attribute, constructors, operations, parameters, and notifications > Simplified creation of connector servers & clients > Support for exporting JMX timers > http://groovy.codehaus.org/Groovy+JmxBuilder 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 38 38
  • 39. JMX Builder (2/2) Examples > Create a connector server  def jmx = new JmxBuilder() jmx.connectorServer(port:9000).start() > Create a connector client  jmx.connectorClient(port:9000).connect() > Export a bean  jmx.export { bean new MyService() } > Defining a timer  jmx.timer(name: quot;jmx.builder:type=Timerquot;, event: quot;heartbeatquot;, period: quot;1squot;).start() > JMX listener  jmx.listener(event: quot;…quot;, from: quot;fooquot;, call: { event -> …}) 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 39 39
  • 40. Agenda > Groovy Overview > Performance Improvements > Syntax Enhancements > Compile-Time Metaprogramming > The Grape Module System > Swing-Related Improvements > Runtime Metaprogramming Additions > JSR-223 Scripting Engine Built-In > JMX Builder > OSGi Readiness 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 40 40
  • 41. OSGi Readiness > The Groovy JAR contains OSGi metadata  Can be reused in OSGi containers out-of-the-box > Tutorials on Groovy and OSGi  http://groovy.codehaus.org/OSGi+and+Groovy  Will show you how to load Groovy as a service, write, publish and consume Groovy services, and more 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 41 41
  • 42. Summary
  • 43. Summary Just Remember that Groovy Rocks! :-) > Groovy 1.6 provides  Important performance gains  Efficient compile-time metaprogramming hooks  New useful features (JMX, javax.script.*, etc.)  A script dependencies system  Various Swing-related improvements  Several runtime metaprogramming additions > Get it now!  http://groovy.codehaus.org/Download 2009 CommunityOne Conference: EAST | developers.sun.com/events/communityone 43 43
  • 44. What’s new in Groovy 1.6? Guillaume Laforge glaforge@gmail.com