Your SlideShare is downloading. ×
0
Main sponsor What’s New in Groovy 2.0? Guillaume	  Laforge  Groovy	  project	  Manager
Guillaume Laforge• Groovy Project Manager at VMware • Initiator of the Grails framework • Creator of the Gaelyk   and Cael...
Agenda• What’s new in Groovy 1.8? –Nicer DSLs with command chains –Runtime performance improvements –GPars bundled for tam...
Agenda• What’s cooking for Groovy 2.0? –Alignments with JDK 7   • Project Coin (small language changes)   • Invoke Dynamic...
Command chains• A grammar improvement allowing you  to drop dots & parens  when chaining method calls –an extended version...
Command chains     	  turn	  left	  	  then	  right	                                           @glaforge   6
Command chains      Alternation of      method names     	  turn	  left	  	  then	  right	                                ...
Command chains      Alternation of      method names     	  turn	  left	  	  then	  right	                                ...
Command chains     	  turn	  left	  	  then	  right	                                           @glaforge   6
Command chains     Equivalent to:     	  	  	  	  	  (	  	  	  	  ).	  	  	  	  (	  	  	  	  	  )     	  turn	  left	  	  ...
LookM  a!N op are ns,no do ts !
Command chains    Before... we used to do... take	  2.pills,	  of:	  chloroquinine,	  after:	  6.hours                    ...
Command chains    Before... we used to do... take	  2.pills,	  of:	  chloroquinine,	  after:	  6.hours     Normal argument...
Command chains    Before... we used to do... take	  2.pills,	  of:	  chloroquinine,	  after:	  6.hours     Normal argument...
Command chains    Before... we used to do... take	  2.pills,	  of:	  chloroquinine,	  after:	  6.hours     Normal argument...
Command chains      Now, even less punctuation! take	  2	  	  pills	  of	  	  chloroquinine	  	  after	  	  6	  hours     ...
Command chains           Now, even less punctuation! 	  	  	  	  (	  ).	  	  	  	  	  (	  	  ).	  	  	  	  	  	  	  	  	  ...
Command chains    //	  Java	  fluent	  API	  approach    class	  RegimenBuilder	  {    	  	  	  	  ...    	  	  	  	  def	...
Command chains       //	  variable	  injection       def	  (of,	  after,	  hours)	  =	  /*...*/       	     {             ...
Command chains                 @glaforge   12
Command chains //	  methods	  with	  multiple	  arguments	  (commas)                                                   @gl...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Command chains //	  methods	  with	  multiple	  arguments	  (commas) take	  coffee	  	  with	  sugar,	  milk	  	  and	  li...
Runtime performance improvements• Significant runtime improvements  for primitive type operations –classical Fibonacci exa...
GPars bundled• GPars is bundled  in the Groovy distribution• GPars covers a wide range of parallel and  concurrent paradig...
Closure enhancements• Closure annotation parameters• Some more functional flavor –composition   • compose several closures...
Closure annotation parameters    @Retention(RetentionPolicy.RUNTIME)    @interface	  Invariant	  {	  	  	  	      	  	  	 ...
Closure annotation parameters    @Retention(RetentionPolicy.RUNTIME)    @interface	  Invariant	  {	  	  	  	      	  	  	 ...
Builtin JSON support• Consuming• Producing• Pretty-printing                       @glaforge   17
Builtin JSON support import	  groovy.json.*	   def	  payload	  =	  new	  URL( 	  	  	  	  "http://github.../json/commits/....
Builtin JSON support import	  groovy.json.*	   	   def	  json	  =	  new	  JsonBuilder()	   	   json.person	  {	  	  	  	  ...
Builtin JSON support import	  groovy.json.*	   	   def	  json	  =	  new	  JsonBuilder()	   	   json.person	  {	  	  	  	  ...
Builtin JSON support  import	  groovy.json.*	    	    println	  JsonOutput.prettyPrint(  	  	  	  	  {"person":{"name":"Gu...
New AST transformations• @Log                    • Controlling the                            execution of your code• @Fie...
@Log• Four different loggers can be injected  –@Log, @Commons, @Log4j, @Slf4j• Possible to implement your own strategy    ...
@Log• Four different loggers can be injected  –@Log, @Commons, @Log4j, @Slf4j• Possible to implement your own strategy    ...
Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long?...
Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long?...
Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long?...
@ThreadInterrupt    @ThreadInterrupt    import	  groovy.transform.ThreadInterrupt	      	      while	  (true)	  {    	  	 ...
@ThreadInterrupt      @ThreadInterrupt      import	  groovy.transform.ThreadInterrupt	        	        while	  (true)	  { ...
@ThreadInterrupt      @ThreadInterrupt      import	  groovy.transform.ThreadInterrupt	        	        while	  (true)	  { ...
@ToString• Provides a default toString() method to your types• Available annotation options  – includeNames, includeFields...
@EqualsAndHashCode• Provides default implementations for equals()  and hashCode() methods          import	  groovy.transfo...
@TupleConstructor• Provides a «classical» constructor with all properties• Several annotation parameter options available ...
@Canonical• One annotation to rule them all! –@Canonical mixes together   • @ToString   • @EqualsAndHashCode   • @TupleCon...
@InheritConstructors• Classes like Exception are painful when  extended, as all the base constructors should  be replicate...
@InheritConstructors• Classes like Exception are painful when  extended, as all the base constructors should  be replicate...
Miscelanous• Compilation customizers• Java 7 diamond operator• Slashy and dollar slashy strings• New GDK methods• (G)Strin...
Compilation customizers• Ability to apply some customization to the Groovy  compilation process• Three available customize...
Imports customizer def	  configuration	  =	  new	  CompilerConfiguration() 	   def	  custo	  =	  new	  ImportCustomizer() ...
Customizing the Groovysh prompt                       @glaforge   33
What’scookingfor 2.0?
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDy...
Groovy 2.0 roadmap                      End	  of	  A                                                       pril?• Java 7 a...
Java 7 / JDK 7• Project Coin and InvokeDynamic                                   @glaforge   36
Binary literals• We had decimal, octal and hexadecimal  notations for number literals• We can now use binary representatio...
Underscore in literals• Now we can also add underscores  in number literals for more readability     long	  creditCardNumb...
Multicatch• One block for multiple exception caught –rather than duplicating the block    try	  {    	  	  	  	  /*	  ...	...
InvokeDynamic• Groovy 2.0 supports JDK 7’s invokeDynamic  –compiler will have a flag for compiling against JDK 7  –might u...
Groovy Modularity• Groovy’s «all» JAR weighs in at 4MB• Nobody needs everything –Template engine, Ant scripting, Swing UI ...
Static Type Checking• Goal: make the Groovy compiler «grumpy»!  – and throw compilation errors (not at runtime)• Not every...
Typos in your variable or methodimport	  groovy.transform.TypeChecked	  void	  method()	  {}	  @TypeChecked	  test()	  {	 ...
Typos in your variable or methodimport	  groovy.transform.TypeChecked	  void	  method()	  {}	  @TypeChecked	  test()	  {	 ...
Typos in your variable or methodimport	  groovy.transform.TypeChecked	                                                    ...
Complain on wrong assignments//	  cannot	  assign	  value	  of	  type...	  to	  variable...int	  x	  =	  new	  Object()Set...
Complain on wrong assignments//	  cannot	  assign	  value	  of	  type...	  to	  variable...int	  x	  =	  new	  Object()Set...
Complain on wrong return types //	  checks	  if/else	  branch	  return	  values int	  method()	  { 	  	  	  	  if	  (true)...
Complain on wrong return types //	  checks	  if/else	  branch	  return	  values int	  method()	  { 	  	  	  	  if	  (true)...
Type inference   @TypeChecked	  test()	  {   	  	  	  	  def	  name	  =	  "	  	  Guillaume	  	  "   	     	  	  	  	  //	 ...
Staticly checked & dyn. methods      @TypeChecked      String	  greeting(String	  name)	  {      	  	  	  	  //	  call	  m...
Instanceof checks @TypeChecked	   void	  test(Object	  val)	  { 	  	  	  	  if	  (val	  instanceof	  String)	  { 	  	  	  ...
Instanceof checks                                                                                No need @TypeChecked	    ...
Instanceof checks                                                                                No need @TypeChecked	    ...
Lowest Upper Bound• Represents the lowest «super» type classes have  in common –may be virtual (aka «non-denotable»)     @...
Lowest Upper Bound• Represents the lowest «super» type classes have  in common –may be virtual (aka «non-denotable»)     @...
Flow typing• Static type checking shouldn’t complain even for  bad coding practicies which work w/o type checks   @TypeChe...
Gotchas: static checking vs dynamic• Type checking works at compile-time –adding @TypeChecked doesn’t change behavior   • ...
Gotchas: runtime metaprogramming     @TypeChecked	       void	  test()	  {     	  	  	  	  Integer.metaClass.foo	  =	  {} ...
Gotchas: runtime metaprogramming     @TypeChecked	       void	  test()	  {     	  	  	  	  Integer.metaClass.foo	  =	  {} ...
Gotchas: runtime metaprogramming     @TypeChecked	       void	  test()	  {     	  	  	  	  Integer.metaClass.foo	  =	  {} ...
Gotchas: closures need explicit types  @TypeChecked	  test()	  {  	  	  	  	  ["a",	  "b",	  "c"].collect	  {  	  	  	  	 ...
Gotchas: closures need explicit types  @TypeChecked	  test()	  {  	  	  	  	  ["a",	  "b",	  "c"].collect	  {	  String	  i...
Closure shared variables @TypeChecked	  test()	  { 	  	  	  	  def	  var	  =	  "abc"	  	  	  	  	  	  	   	  	  	  	  def	...
Closure shared variables                                                                         var assigned in the closu...
Closure shared variables                                                                         var assigned in the closu...
Closure shared variables                                                                         var assigned in the closu...
Closure shared variables    class	  A	  	  	  	  	  	  	  	  	  	  	  {	  void	  foo()	  {}	  }    class	  B	  extends	  A...
Closure shared variables    class	  A	  	  	  	  	  	  	  	  	  	  	  {	  void	  foo()	  {}	  }    class	  B	  extends	  A...
Static Compilation• Given your Groovy code can be type checked...  we can as well compile it «statically» –ie. generate th...
Static Compilation: advantages• You gain: –Type safety   • thanks to static type checking     – static compilation builds ...
Static Compilation: disadvantages• But you loose: –Dynamic features   • metaclass changes, categories, etc. –Dynamic metho...
Staticly compiled & dyn. methods      @CompileStatic      String	  greeting(String	  name)	  {      	  	  	  	  //	  call	...
What about performance?• Comparisons between: –Java –Groovy static compilation   • ie. Groovy 2.0 –Groovy with primitive o...
What about performance?                                              Pi	  (π)	              Binary                        ...
Summary• Main themes of the Groovy 2.0 release –Modularity –Embark the JDK 7 enhancements   • Project Coin   • Invoke Dyna...
Summary           ROCKS!          @glaforge   63
Thank you!                              e                       L aforg pment       Guil laume vy Develo                  ...
Q&AGot questions,       really?
Image credits•   Iceberg: http://hqworld.net/gallery/data/media/20/tip_of_the_iceberg.jpg•   Bicycle: http://drunkcyclist....
Upcoming SlideShare
Loading in...5
×

Whats new in Groovy 2.0?

10,605

Published on

Presentation on Groovy 2.0 given at the 33rd Degree conference in Krakow, Poland, in March 2012.

Published in: Technology, Education
1 Comment
20 Likes
Statistics
Notes
  • Great presentation, but just FYI it looks like there are some character encoding issues in the code slides? I see a lot of space and tab characters being shown as boxes, which makes some of them hard to read.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
10,605
On Slideshare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
182
Comments
1
Likes
20
Embeds 0
No embeds

No notes for slide

Transcript of "Whats new in Groovy 2.0?"

  1. 1. Main sponsor What’s New in Groovy 2.0? Guillaume  Laforge Groovy  project  Manager
  2. 2. Guillaume Laforge• Groovy Project Manager at VMware • Initiator of the Grails framework • Creator of the Gaelyk and Caelyf toolkits• Co-author of Groovy in Action• Follow me on... • My blog: http://glaforge.appspot.com • Twitter: @glaforge • Google+: http://gplus.to/glaforge @glaforge 2
  3. 3. Agenda• What’s new in Groovy 1.8? –Nicer DSLs with command chains –Runtime performance improvements –GPars bundled for taming your multicores –Closure enhancements –Builtin JSON support –New AST transformations @glaforge 3
  4. 4. Agenda• What’s cooking for Groovy 2.0? –Alignments with JDK 7 • Project Coin (small language changes) • Invoke Dynamic support – Continued runtime performance improvements –Static type checking –Static compilation –Modularity @glaforge 4
  5. 5. Command chains• A grammar improvement allowing you to drop dots & parens when chaining method calls –an extended version of top-level statements like println• Less dots, less parens allow you to –write more readable business rules –in almost plain English sentences • (or any language, of course) @glaforge 5
  6. 6. Command chains  turn  left    then  right   @glaforge 6
  7. 7. Command chains Alternation of method names  turn  left    then  right   @glaforge 6
  8. 8. Command chains Alternation of method names  turn  left    then  right   and parameters (even named ones) @glaforge 6
  9. 9. Command chains  turn  left    then  right   @glaforge 6
  10. 10. Command chains Equivalent to:          (        ).        (          )  turn  left    then  right   @glaforge 6
  11. 11. LookM a!N op are ns,no do ts !
  12. 12. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours @glaforge 8
  13. 13. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours Normal argument @glaforge 8
  14. 14. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours Normal argument Named arguments @glaforge 8
  15. 15. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours Normal argument Named arguments Woud call: def  take(Map  m,  Quantity  q) @glaforge 8
  16. 16. Command chains Now, even less punctuation! take  2    pills  of    chloroquinine    after    6  hours @glaforge 9
  17. 17. Command chains Now, even less punctuation!        (  ).          (    ).                            (          ).  (          ) take  2    pills  of    chloroquinine    after    6  hours @glaforge 9
  18. 18. Command chains //  Java  fluent  API  approach class  RegimenBuilder  {        ...        def  take(int  n)  {                this.pills  =  n                return  this        }        def  pills(String  of)  {                return  this        }        ... } @glaforge 10
  19. 19. Command chains //  variable  injection def  (of,  after,  hours)  =  /*...*/   { } //  implementing  the  DSL  logic def  take(n)  {        [pills:  {  of  -­‐>                [chloroquinine:  {  after  -­‐>                        [6:  {  time  -­‐>  }]                }]        }] } //  -­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐-­‐ take  2  pills  of  chloroquinine  after  6  hours @glaforge 11
  20. 20. Command chains @glaforge 12
  21. 21. Command chains //  methods  with  multiple  arguments  (commas) @glaforge 12
  22. 22. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor @glaforge 12
  23. 23. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation @glaforge 12
  24. 24. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good @glaforge 12
  25. 25. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures @glaforge 12
  26. 26. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} @glaforge 12
  27. 27. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens @glaforge 12
  28. 28. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names @glaforge 12
  29. 29. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms @glaforge 12
  30. 30. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies @glaforge 12
  31. 31. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies @glaforge 12
  32. 32. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {} //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies @glaforge 12
  33. 33. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names //  possible  with  an  odd  number  of  terms take  3    cookies @glaforge 12
  34. 34. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names            (      ).                .        (          ) //  possible  with  an  odd  number  of  terms take  3    cookies @glaforge 12
  35. 35. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor        (            ).        (                      ).      (            ) //  leverage  named-­‐args  as  punctuation check  that:  margarita    tastes  good          (                              ).            (        ) //  closure  parameters  for  new  control  structures given  {}    when  {}    then  {}          (    ).        (    ).        (    ) //  zero-­‐arg  methods  require  parens select  all    unique()  from  names            (      ).                .        (          ) //  possible  with  an  odd  number  of  terms take  3    cookies        (  ). @glaforge 12
  36. 36. Runtime performance improvements• Significant runtime improvements for primitive type operations –classical Fibonacci example x13 faster! –closer to Java performance• Some direct method calls on this• More on performance later on @glaforge 13
  37. 37. GPars bundled• GPars is bundled in the Groovy distribution• GPars covers a wide range of parallel and concurrent paradigms –actors, fork/join, map/filter/reduce, dataflow, agents –parallel arrays, executors, STM, and more...• And you can use it from plain Java as well! @glaforge 14
  38. 38. Closure enhancements• Closure annotation parameters• Some more functional flavor –composition • compose several closures into one single closure –trampoline • avoid stack overflow errors for recursive algorithms –memoization • remember the outcome of previous closure invocations• Currying improvements @glaforge 15
  39. 39. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }{   @Invariant({  number  >=  0  }) class  Distance  {                float  number                String  unit }     def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) @glaforge 16
  40. 40. Closure annotation parameters @Retention(RetentionPolicy.RUNTIME) @interface  Invariant  {                Class  value()  //  a  closure  class }{   @Invariant({  number  >=  0  }) class  Distance  {                float  number         Cont racts        String  unit an’s G }   Poor-m   def  d  =  new  Distance(number:  10,  unit:  "meters")   def  anno  =  Distance.getAnnotation(Invariant) def  check  =  anno.value().newInstance(d,  d) assert  check(d) @glaforge 16
  41. 41. Builtin JSON support• Consuming• Producing• Pretty-printing @glaforge 17
  42. 42. Builtin JSON support import  groovy.json.*   def  payload  =  new  URL(        "http://github.../json/commits/...").text   def  slurper  =  new  JsonSlurper() def  doc  =  slurper.parseText(payload)   doc.commits.message.each  {  println  it  } @glaforge 18
  43. 43. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     json.person  {                name  "Guillaume"        age  34                pets  "Hector",  "Felix" }   println  json.toString() @glaforge 19
  44. 44. Builtin JSON support import  groovy.json.*     def  json  =  new  JsonBuilder()     json.person  {         {                name  "Guillaume"        "person":  {                        age  34                        "name":  "Guillaume",                              "age":  34,                        pets  "Hector",  "Felix"                "pets":  [                         }                          "Hector",                         println  json.toString()                        "Felix"                                ]                } } @glaforge 19
  45. 45. Builtin JSON support import  groovy.json.*     println  JsonOutput.prettyPrint(        {"person":{"name":"Guillaume","age":34,  +          "pets":["Hector","Felix"]}})   {                "person":  {                                "name":  "Guillaume",                            "age":  34,                                "pets":  [                                                "Hector",                                                "Felix"                                ]                } } @glaforge 20
  46. 46. New AST transformations• @Log • Controlling the execution of your code• @Field – @ThreadInterrupt, – @TimedInterrupt, – @ConditionalInterrupt• @AutoClone• @AutoExternalizable • @InheritConstructor• @Canonical • @WithReadLock – @ToString, – @EqualsAndHashCode, • @WithWriteLock – @TupleConstructor • @ListenerList @glaforge 21
  47. 47. @Log• Four different loggers can be injected –@Log, @Commons, @Log4j, @Slf4j• Possible to implement your own strategy import  groovy.util.logging.*     @Log class  Car  {                Car()  {                                log.info  Car  constructed                } }     def  c  =  new  Car() @glaforge 22
  48. 48. @Log• Four different loggers can be injected –@Log, @Commons, @Log4j, @Slf4j• Possible to implement your own strategy import  groovy.util.logging.*     @Log class  Car  {         Guarded        Car()  {                 w/ an if                log.info  Car  constructed                } }     def  c  =  new  Car() @glaforge 22
  49. 49. Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long? –what if the code consumes too many resources? @glaforge 23
  50. 50. Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long? –what if the code consumes too many resources? @glaforge 23
  51. 51. Controlling code execution• Your application may run user’s code –what if the code runs in infinite loops or for too long? –what if the code consumes too many resources?• 3 new transforms at your rescue –@ThreadInterrupt: adds Thread#isInterrupted checks so your executing thread stops when interrupted –@TimedInterrupt: adds checks in method and closure bodies to verify it’s run longer than expected –@ConditionalInterrupt: adds checks with your own conditional logic to break out from the user code @glaforge 23
  52. 52. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  {        //  eat  lots  of  CPU } 24 @glaforge 33
  53. 53. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  { {        if  (Thread.currentThread.isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU } 24 @glaforge 33
  54. 54. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  { {        if  (Thread.currentThread.isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU }• Two optional annotation parameters available –checkOnMethodStart (true by default) –applyToAllClasses (true by default) 24 @glaforge 33
  55. 55. @ToString• Provides a default toString() method to your types• Available annotation options – includeNames, includeFields, includeSuper, excludes import  groovy.transform.ToString     @ToString class  Person  {                String  name                int  age }     println  new  Person(name:  Pete,  age:  15) //  =>  Person(Pete,  15) @glaforge 25
  56. 56. @EqualsAndHashCode• Provides default implementations for equals() and hashCode() methods import  groovy.transform.EqualsAndHashCode     @EqualsAndHashCode class  Coord  {                int  x,  y }     def  c1  =  new  Coord(x:  20,  y:  5) def  c2  =  new  Coord(x:  20,  y:  5)     assert  c1  ==  c2 assert  c1.hashCode()  ==  c2.hashCode() @glaforge 26
  57. 57. @TupleConstructor• Provides a «classical» constructor with all properties• Several annotation parameter options available import  groovy.transform.TupleConstructor     @TupleConstructor   class  Person  {                String  name                int  age }     def  m  =  new  Person(Marion,  3)               assert  m.name  ==  Marion assert  m.age    ==  3 @glaforge 27
  58. 58. @Canonical• One annotation to rule them all! –@Canonical mixes together • @ToString • @EqualsAndHashCode • @TupleConstructor• You can customize behavior by combining @Canonical and one of the other annotations @glaforge 28
  59. 59. @InheritConstructors• Classes like Exception are painful when extended, as all the base constructors should be replicatedclass  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            }} @glaforge 29
  60. 60. @InheritConstructors• Classes like Exception are painful when extended, as all the base constructors should be replicatedimport  groovy.transform.*@InheritConstructorsclass  CustomException  extends  Exception  {        CustomException()                                                {  super()              }        CustomException(String  msg)                            {  super(msg)        }        CustomException(String  msg,  Throwable  t)  {  super(msg,  t)  }        CustomException(Throwable  t)                          {  super(t)            }} @glaforge 29
  61. 61. Miscelanous• Compilation customizers• Java 7 diamond operator• Slashy and dollar slashy strings• New GDK methods• (G)String to Enum coercion• Customizing the Groovysh prompt• Executing remote scripts @glaforge 30
  62. 62. Compilation customizers• Ability to apply some customization to the Groovy compilation process• Three available customizers –ImportCustomizer –ASTTransformationCustomizer –SecureASTCustomizer• But you can implement your own @glaforge 31
  63. 63. Imports customizer def  configuration  =  new  CompilerConfiguration()   def  custo  =  new  ImportCustomizer() custo.addStaticStar(Math.name) configuration.addCompilationCustomizers(custo)     def  result  =  new  GroovyShell(configuration)                          //  import  static  java.lang.Math.*        .evaluate("  cos  PI/3  ")                             @glaforge 32
  64. 64. Customizing the Groovysh prompt @glaforge 33
  65. 65. What’scookingfor 2.0?
  66. 66. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  67. 67. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  68. 68. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  69. 69. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  70. 70. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  71. 71. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  72. 72. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  73. 73. Groovy 2.0 roadmap• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  74. 74. Groovy 2.0 roadmap End  of  A pril?• Java 7 alignements: Project Coin –binary literals –underscore in literals –multicatch• JDK 7: InvokeDynamic• Towards a more modular Groovy• Static type checking• Static compilation @glaforge 35
  75. 75. Java 7 / JDK 7• Project Coin and InvokeDynamic @glaforge 36
  76. 76. Binary literals• We had decimal, octal and hexadecimal notations for number literals• We can now use binary representations too int  x  =  0b10101111 assert  x  ==  175   byte  aByte  =  0b00100001 assert  aByte  ==  33   int  anInt  =  0b1010000101000101 assert  anInt  ==  41285 @glaforge 37
  77. 77. Underscore in literals• Now we can also add underscores in number literals for more readability long  creditCardNumber  =  1234_5678_9012_3456L long  socialSecurityNumbers  =  999_99_9999L float  monetaryAmount  =  12_345_132.12 long  hexBytes  =  0xFF_EC_DE_5E long  hexWords  =  0xFFEC_DE5E long  maxLong  =  0x7fff_ffff_ffff_ffffL long  alsoMaxLong  =  9_223_372_036_854_775_807L long  bytes  =  0b11010010_01101001_10010100_10010010 @glaforge 38
  78. 78. Multicatch• One block for multiple exception caught –rather than duplicating the block try  {        /*  ...  */ }  catch(IOException  |  NullPointerException  e)  {        /*  one  block  to  treat  2  exceptions  */ } @glaforge 39
  79. 79. InvokeDynamic• Groovy 2.0 supports JDK 7’s invokeDynamic –compiler will have a flag for compiling against JDK 7 –might use the invokeDynamic backport for < JDK 7• Benefits –more runtime performance! • at least as fast as current «dynamic» Groovy –in the long run, will allow us to get rid of code! • call site caching, thanks to MethodHandles • metaclass registry, thanks to ClassValues • will let the JIT inline calls more easily @glaforge 40
  80. 80. Groovy Modularity• Groovy’s «all» JAR weighs in at 4MB• Nobody needs everything –Template engine, Ant scripting, Swing UI building...• Provide a smaller core –and several smaller JARs per feature• Provide hooks for setting up DGM methods, etc. @glaforge 41
  81. 81. Static Type Checking• Goal: make the Groovy compiler «grumpy»! – and throw compilation errors (not at runtime)• Not everybody needs dynamic features all the time – think Java libraries scripting• Grumpy should... – tell you about your method or variable typos – complain if you call methods that don’t exist – shout on assignments of wrong types – infer the types of your variables – figure out GDK methods – etc... @glaforge 42
  82. 82. Typos in your variable or methodimport  groovy.transform.TypeChecked  void  method()  {}  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume"        //  variable  naamme  is  undeclared        println  naamme} @glaforge 43
  83. 83. Typos in your variable or methodimport  groovy.transform.TypeChecked  void  method()  {}  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared        println  naamme errors!} @glaforge 43
  84. 84. Typos in your variable or methodimport  groovy.transform.TypeChecked   Annotation can be atvoid  method()  {} class or method level  @TypeChecked  test()  {        //  Cannot  find  matching  method  metthhoood()        metthhoood()          def  name  =  "Guillaume" Compilation        //  variable  naamme  is  undeclared        println  naamme errors!} @glaforge 43
  85. 85. Complain on wrong assignments//  cannot  assign  value  of  type...  to  variable...int  x  =  new  Object()Set  set  =  new  Object()  def  o  =  new  Object()int  x  =  o  String[]  strings  =  [a,b,c]int  str  =  strings[0]  //  cannot  find  matching  method  plus()int  i  =  0i  +=  1 @glaforge 44
  86. 86. Complain on wrong assignments//  cannot  assign  value  of  type...  to  variable...int  x  =  new  Object()Set  set  =  new  Object() Compilation  def  o  =  new  Object() errors!int  x  =  o  String[]  strings  =  [a,b,c]int  str  =  strings[0]  //  cannot  find  matching  method  plus()int  i  =  0i  +=  1 @glaforge 44
  87. 87. Complain on wrong return types //  checks  if/else  branch  return  values int  method()  {        if  (true)  {  String  }        else  {  42  } } //  works  for  switch/case  &  try/catch/finally   //  transparent  toString()  implied String  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name } @glaforge 45
  88. 88. Complain on wrong return types //  checks  if/else  branch  return  values int  method()  {        if  (true)  {  String  } Compilation        else  {  42  } } error! //  works  for  switch/case  &  try/catch/finally   //  transparent  toString()  implied String  greeting(String  name)  {        def  sb  =  new  StringBuilder()        sb  <<  "Hi  "  <<  name } @glaforge 45
  89. 89. Type inference @TypeChecked  test()  {        def  name  =  "    Guillaume    "          //  String  type  infered  (even  inside  GString)        println  "NAME  =  ${name.toUpperCase()}"            //  Groovy  GDK  method  support        //  (GDK  operator  overloading  too)        println  name.trim()          int[]  numbers  =  [1,  2,  3]        //  Element  n  is  an  int        for  (int  n  in  numbers)  {                println  n        } } @glaforge 46
  90. 90. Staticly checked & dyn. methods @TypeChecked String  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase()) }   //  usual  dynamic  behavior String  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString() } @glaforge 47
  91. 91. Instanceof checks @TypeChecked   void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } @glaforge 48
  92. 92. Instanceof checks No need @TypeChecked   for casts void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } @glaforge 48
  93. 93. Instanceof checks No need @TypeChecked   for casts void  test(Object  val)  {        if  (val  instanceof  String)  {                println  val.toUpperCase()        }  else  if  (val  instanceof  Number)  {                println  "X"  *  val.intValue()        } } Can call String#multiply(int) from the Groovy Development Kit @glaforge 48
  94. 94. Lowest Upper Bound• Represents the lowest «super» type classes have in common –may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } @glaforge 49
  95. 95. Lowest Upper Bound• Represents the lowest «super» type classes have in common –may be virtual (aka «non-denotable») @TypeChecked  test()  {        //  an  integer  and  a  BigDecimal        return  [1234,  3.14] } Inferred return type: List<Number> @glaforge 49
  96. 96. Flow typing• Static type checking shouldn’t complain even for bad coding practicies which work w/o type checks @TypeChecked  test()  {        def  var  =  123                  //  inferred  type  is  int        int  x  =  var                      //  var  is  an  int        var  =  "123"                      //  assign  var  with  a  String        x  =  var.toInteger()      //  no  problem,  no  need  to  cast        var  =  123        x  =  var.toUpperCase()  //  error,  var  is  int! } @glaforge 50
  97. 97. Gotchas: static checking vs dynamic• Type checking works at compile-time –adding @TypeChecked doesn’t change behavior • do not confuse with static compilation• Most dynamic features cannot be type checked –metaclass changes, categories –dynamically bound variables (ex: script’s binding)• However, compile-time metaprogramming works –as long as proper type information is defined @glaforge 51
  98. 98. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } @glaforge 52
  99. 99. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Not allowed: metaClass property is dynamic @glaforge 52
  100. 100. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Method not Not allowed: recognized metaClass property is dynamic @glaforge 52
  101. 101. Gotchas: closures need explicit types @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {                it.toUpperCase()  //  Not  OK        } }• A «Groovy Enhancement Proposal» to address this issue @glaforge 53
  102. 102. Gotchas: closures need explicit types @TypeChecked  test()  {        ["a",  "b",  "c"].collect  {  String  it  -­‐>                it.toUpperCase()  //  OK,  it’s  a  String        } }• A «Groovy Enhancement Proposal» to address this issue @glaforge 53
  103. 103. Closure shared variables @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } @glaforge 54
  104. 104. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } @glaforge 54
  105. 105. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  } Impossible to ensure        cl() the assignment        var.toUpperCase()    //  Not  OK! really happens } @glaforge 54
  106. 106. Closure shared variables var assigned in the closure: «shared closure variable» @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  } Impossible to ensure        cl() the assignment        var.toUpperCase()    //  Not  OK! really happens } Only methods of the most specific compatible type (LUB) are allowed by the type checker @glaforge 54
  107. 107. Closure shared variables class  A                      {  void  foo()  {}  } class  B  extends  A  {  void  bar()  {}  } @TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK! } @glaforge 55
  108. 108. Closure shared variables class  A                      {  void  foo()  {}  } class  B  extends  A  {  void  bar()  {}  } @TypeChecked  test()  {        def  var  =  new  A()        def  cl  =  {  var  =  new  B()  }        cl()        var.foo()      //  OK! } var is at least an instance of A @glaforge 55
  109. 109. Static Compilation• Given your Groovy code can be type checked... we can as well compile it «statically» –ie. generate the same byte code as javac @glaforge 56
  110. 110. Static Compilation: advantages• You gain: –Type safety • thanks to static type checking – static compilation builds upon static type checking –Faster code • as close to Java’s performance as possible –Code immune to «monkey patching» • metaprogramming badly used can interfere with framework code –Smaller bytecode size @glaforge 57
  111. 111. Static Compilation: disadvantages• But you loose: –Dynamic features • metaclass changes, categories, etc. –Dynamic method dispatch • although emulated as close as possible to «dynamic» Groovy @glaforge 58
  112. 112. Staticly compiled & dyn. methods @CompileStatic String  greeting(String  name)  {        //  call  method  with  dynamic  behavior        //  but  with  proper  signature        generateMarkup(name.toUpperCase()) }   //  usual  dynamic  behavior String  generateMarkup(String  name)  {        def  sw  =  new  StringWriter()        new  MarkupBuilder(sw).html  {                body  {                        div  name                }        }        sw.toString() } @glaforge 59
  113. 113. What about performance?• Comparisons between: –Java –Groovy static compilation • ie. Groovy 2.0 –Groovy with primitive optimizations • ie. since Groovy 1.8 –Groovy without optimizations • ie. Groovy 1.7 and before @glaforge 60
  114. 114. What about performance? Pi  (π)   Binary Fibonacci quadrature trees Java 140  ms 93  ms 4.5  s StaMc 150  ms 220  ms 7.6  s1.7 1.8 2.0 compilaMon PrimiMve   270  ms 110  ms 29.6  s opMmizaMons No  prim. 3800  ms 3.8  s 50.0  s opMmizaMons @glaforge 61
  115. 115. Summary• Main themes of the Groovy 2.0 release –Modularity –Embark the JDK 7 enhancements • Project Coin • Invoke Dynamic –Static aspects • Static type checking • Static compilation @glaforge 62
  116. 116. Summary ROCKS! @glaforge 63
  117. 117. Thank you! e L aforg pment Guil laume vy Develo o Head of Gro m gmail.co l aforge@ ge Email: g @glafor rge o/glafo m : .t Twitter : http://gplus pspot.co + p Google p://glaforge.a tt Blog: h @glaforge 64
  118. 118. Q&AGot questions, really?
  119. 119. Image credits• Iceberg: http://hqworld.net/gallery/data/media/20/tip_of_the_iceberg.jpg• Bicycle: http://drunkcyclist.com/gallery/main.php?g2_view=core.DownloadItem&g2_itemId=2131&g2_serialNumber=2• Pills: http://www.we-ew.com/wp-content/uploads/2011/01/plan-b-pills.jpg• Chains: http://2.bp.blogspot.com/-GXDVqUYSCa0/TVdBsON4tdI/AAAAAAAAAW4/EgJOUmAxB28/s1600/breaking-chains5_copy9611.jpg• Cooking: http://www.flickr.com/photos/eole/449958332/sizes/l/• Oui nide iou: http://desencyclopedie.wikia.com/wiki/Fichier:Superdupont_we_need_you.jpg• Guitar: http://www.lelitteraire.com/IMG/breveon323.jpg• Trampoline: http://www.fitness-online.fr/images/trampoline-1-m.jpg• Curry: http://www.pot-a-epices.com/wp-content/uploads/2009/02/curry1.jpg• Slurp: http://www.ohpacha.com/218-532-thickbox/gamelle-slurp.jpg• Caution: http://www.jeunes-epinay-sur-seine.fr/wp-content/uploads/2010/11/caution-colocation.jpg• Grumpy: http://mafeuilledechou.fr/__oneclick_uploads/2010/05/grumpy.jpg• Modularity: http://php.jglobal.com/blog/wp-content/uploads/2009/11/modularity.jpg• Agenda: http://www.plombiereslesbains.fr/images/stories/agenda.jpg• Java 7: http://geeknizer.com/wp-content/uploads/java7.jpg• WIP: http://www.connetport.com/wp-content/uploads/Work_in_progress.svg_.png• Grumpy 2: http://grumpy.division-par-zero.fr/wp-content/images/grumpy.jpg• @glaforge 66
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×