What's New in Groovy 1.6?
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

What's New in Groovy 1.6?

on

  • 2,751 views

 

Statistics

Views

Total Views
2,751
Views on SlideShare
2,749
Embed Views
2

Actions

Likes
4
Downloads
41
Comments
0

1 Embed 2

http://www.slideshare.net 2

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

What's New in Groovy 1.6? Presentation Transcript

  • 1. What’s new in Groovy 1.6 Guillaume Laforge SpringSource Groovy Project Manager
  • 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…
  • 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
  • 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
  • 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
  • 6. Features at a Glance Lots More Than This!
    • Fully Object-Oriented
    • Joint compiler : seamless Java integration
    • Closures : reusable blocks of code / anon 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
  • 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 "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println( helloWorld.greet() ); } }
  • 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 "Hello " + name; } public static void main(String[] args) { HelloWorld helloWorld = new HelloWorld(); helloWorld.setName("Groovy"); System.out.println( helloWorld.greet() ); } }
  • 9. A Taste of Groovy — Take 3 A Groovier Program!
    • class HelloWorld { String name String greet() { "Hello $name" } } def helloWorld = new HelloWorld(name: "Groovy") println helloWorld.greet()
  • 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/
  • 11. The Groovy Web Console A Screenshot
  • 12. 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
  • 13. 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
  • 14. 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
  • 15. 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
  • 16. 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("foo") 1 } catch(e) { 2 } finally { 3 } } assert method(false) == 1 assert method(true) == 2
  • 17. 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…
  • 18. 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
  • 19. 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
  • 20. 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!
  • 21. @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 {}
  • 22. @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
  • 23. @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 = retrieveFromSlowDB() }
    • Groovy will handle the boiler-plate code for you
  • 24. @Delegate Not Just for Managers!
    • You can delegate to fields of your class
      • Think multiple inheritance
      • class Employee { def doTheWork() { "done" } } class Manager { @Delegate Employee slave = new Employee() } def god = new Manager() assert god.doTheWork() == "done"
    • Damn manager who will get all the praise…
  • 25. 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
  • 26. 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 , "/", SESSIONS); ctx.resourceBase = "." ctx.addServlet(GroovyServlet, "*.groovy") srv.start() }
  • 27. 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
  • 28. @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("prop", this.prop, this.prop = prop); } }
  • 29. @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
  • 30. Griffon The Swing MVC Framework
    • Leverages Groovy’s SwingBuilder and Grails’ infrastructure
      • http://griffon.codehaus.org
    • Don’t miss the “Griffon in Depth” BOF-5189!
      • Wednesday 8:45pm, Gateway 104
  • 31. 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
  • 32.
  • 33. 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
  • 34. 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) } }
  • 35. Runtime Mixins Inject New Behavior to Types at Runtime
    • class FlyingAbility { def fly() { "I'm ${name} and I fly!" } } class JamesBondVehicle { String getName() { "James Bond's vehicle" } } JamesBondVehicle.mixin FlyingAbility assert new JamesBondVehicle().fly() == "I'm James Bond's vehicle and I fly!"
  • 36. 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
  • 37. 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("groovy") assert engine.evaluate("2 + 3") == 5
    • To evaluate Groovy scripts at runtime in your application, just drop the Groovy JAR in your classpath!
  • 38. 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
  • 39. 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
  • 40. 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()
    • Ex port a bean
      • jmx.export { bean new MyService() }
    • Defining a timer
      • jmx.timer(name: "jmx.builder:type=Timer", event: "heartbeat", period: "1s").start()
    • JMX listener
      • jmx.listener(event: "…", from: "foo", call: { event -> …})
  • 41. 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
  • 42. 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
  • 43. Summary
  • 44. 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
  • 45. Guillaume Laforge [email_address]