SlideShare a Scribd company logo
1 of 119
Download to read offline
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 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
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
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
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
Command chains




     	
  turn	
  left	
  	
  then	
  right	
  




                                         @glaforge   6
Command chains
      Alternation of
      method names




     	
  turn	
  left	
  	
  then	
  right	
  




                                         @glaforge   6
Command chains
      Alternation of
      method names




     	
  turn	
  left	
  	
  then	
  right	
  


                               and parameters
                             (even named ones)



                                         @glaforge   6
Command chains




     	
  turn	
  left	
  	
  then	
  right	
  




                                         @glaforge   6
Command chains



     Equivalent to:


     	
  	
  	
  	
  	
  (	
  	
  	
  	
  ).	
  	
  	
  	
  (	
  	
  	
  	
  	
  )
     	
  turn	
  left	
  	
  then	
  right	
  




                                                                        @glaforge    6
LookM  a!
N op are ns,
no do ts !
Command chains


    Before... we used to do...


 take	
  2.pills,	
  of:	
  chloroquinine,	
  after:	
  6.hours




                                                  @glaforge       8
Command chains


    Before... we used to do...


 take	
  2.pills,	
  of:	
  chloroquinine,	
  after:	
  6.hours



     Normal argument




                                                  @glaforge       8
Command chains


    Before... we used to do...


 take	
  2.pills,	
  of:	
  chloroquinine,	
  after:	
  6.hours



     Normal argument                 Named arguments




                                                  @glaforge       8
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
Command chains


      Now, even less punctuation!


 take	
  2	
  	
  pills	
  of	
  	
  chloroquinine	
  	
  after	
  	
  6	
  hours




                                                                 @glaforge          9
Command chains


           Now, even less punctuation!


 	
  	
  	
  	
  (	
  ).	
  	
  	
  	
  	
  (	
  	
  ).	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (	
  	
  	
  	
  	
  ).	
  (	
  	
  	
  	
  	
  )
 take	
  2	
  	
  pills	
  of	
  	
  chloroquinine	
  	
  after	
  	
  6	
  hours




                                                                                                                              @glaforge                            9
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
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
Command chains




                 @glaforge   12
Command chains
 //	
  methods	
  with	
  multiple	
  arguments	
  (commas)




                                                   @glaforge   12
Command chains
 //	
  methods	
  with	
  multiple	
  arguments	
  (commas)
 take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor




                                                          @glaforge   12
Command chains
 //	
  methods	
  with	
  multiple	
  arguments	
  (commas)
 take	
  coffee	
  	
  with	
  sugar,	
  milk	
  	
  and	
  liquor

 //	
  leverage	
  named-­‐args	
  as	
  punctuation




                                                          @glaforge   12
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Builtin JSON support

• Consuming

• Producing

• Pretty-printing




                       @glaforge   17
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
Builtin JSON support
 import	
  groovy.json.*	
  
 	
  
 def	
  json	
  =	
  new	
  JsonBuilder()	
  
 	
  
 json.person	
  {	
  	
  	
  	
  
 	
  	
  	
  	
  name	
  "Guillaume"
 	
  	
  	
  	
  age	
  34	
  	
  	
  	
  
 	
  	
  	
  	
  pets	
  "Hector",	
  "Felix"
 }	
  
 println	
  json.toString()



                                                @glaforge   19
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
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
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
@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
@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
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
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
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
@ThreadInterrupt
    @ThreadInterrupt
    import	
  groovy.transform.ThreadInterrupt	
  
    	
  
    while	
  (true)	
  {


    	
  	
  	
  	
  //	
  eat	
  lots	
  of	
  CPU
    }




                                                                 24


                                                     @glaforge        33
@ThreadInterrupt
      @ThreadInterrupt
      import	
  groovy.transform.ThreadInterrupt	
  
      	
  
      while	
  (true)	
  {

  {   	
  	
  	
  	
  if	
  (Thread.currentThread.isInterrupted())
      	
  	
  	
  	
  	
  	
  	
  	
  throw	
  new	
  InterruptedException()   }
      	
  	
  	
  	
  //	
  eat	
  lots	
  of	
  CPU
      }




                                                                                   24


                                                              @glaforge                 33
@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
@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
@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
@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
@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
@InheritConstructors
• Classes like Exception are painful when
  extended, as all the base constructors should
  be replicated



class	
  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
@InheritConstructors
• Classes like Exception are painful when
  extended, as all the base constructors should
  be replicated

import	
  groovy.transform.*

@InheritConstructors
class	
  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
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
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
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
Customizing the Groovysh prompt




                       @glaforge   33
What’s
cooking
for 2.0?
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
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
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
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
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
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
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
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
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
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 representations too
           int	
  x	
  =	
  0b10101111
           assert	
  x	
  ==	
  175
           	
  
           byte	
  aByte	
  =	
  0b00100001
           assert	
  aByte	
  ==	
  33
           	
  
           int	
  anInt	
  =	
  0b1010000101000101
           assert	
  anInt	
  ==	
  41285


                                               @glaforge   37
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
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
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
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
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
Typos in your variable or method

import	
  groovy.transform.TypeChecked
	
  
void	
  method()	
  {}
	
  
@TypeChecked	
  test()	
  {
	
  	
  	
  	
  //	
  Cannot	
  find	
  matching	
  method	
  metthhoood()
	
  	
  	
  	
  metthhoood()
	
  
	
  	
  	
  	
  def	
  name	
  =	
  "Guillaume"
	
  	
  	
  	
  //	
  variable	
  naamme	
  is	
  undeclared
	
  	
  	
  	
  println	
  naamme
}




                                                                   @glaforge   43
Typos in your variable or method

import	
  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
Typos in your variable or method

import	
  groovy.transform.TypeChecked
	
                                                                      Annotation can be at
void	
  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
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	
  =	
  0
i	
  +=	
  '1'




                                                                        @glaforge   44
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	
  =	
  0
i	
  +=	
  '1'




                                                                        @glaforge            44
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
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
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
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
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
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
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
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
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
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
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
Gotchas: runtime metaprogramming

     @TypeChecked	
  
     void	
  test()	
  {
     	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
     	
  	
  	
  	
  123.foo()
     }




                                                @glaforge   52
Gotchas: runtime metaprogramming

     @TypeChecked	
  
     void	
  test()	
  {
     	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
     	
  	
  	
  	
  123.foo()
     }




                                           Not allowed:
                                        metaClass property
                                           is dynamic


                                                @glaforge    52
Gotchas: runtime metaprogramming

     @TypeChecked	
  
     void	
  test()	
  {
     	
  	
  	
  	
  Integer.metaClass.foo	
  =	
  {}
     	
  	
  	
  	
  123.foo()
     }



         Method not
                                           Not allowed:
         recognized
                                        metaClass property
                                           is dynamic


                                                @glaforge    52
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
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
Closure shared variables

 @TypeChecked	
  test()	
  {
 	
  	
  	
  	
  def	
  var	
  =	
  "abc"	
  	
  	
  	
  	
  	
  	
  
 	
  	
  	
  	
  def	
  cl	
  =	
  {	
  var	
  =	
  new	
  Date()	
  }
 	
  	
  	
  	
  cl()
 	
  	
  	
  	
  var.toUpperCase()	
  	
  //	
  Not	
  OK!
 }




                                                                         @glaforge   54
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
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
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
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
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
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
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
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
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
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
What about performance?
                                              Pi	
  (π)	
              Binary
                               Fibonacci
                                            quadrature                 trees

                  Java          140	
  ms      93	
  ms                4.5	
  s

                StaMc
                                150	
  ms     220	
  ms                7.6	
  s
1.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
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
Summary




           ROCKS!
          @glaforge   63
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
Q&A
Got questions,
       really?
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

More Related Content

Viewers also liked

Iklim dan Budaya Organisasi
Iklim dan Budaya Organisasi Iklim dan Budaya Organisasi
Iklim dan Budaya Organisasi pjj_kemenkes
 
REACT Singapore: Caring For The Caretaker
REACT Singapore: Caring For The CaretakerREACT Singapore: Caring For The Caretaker
REACT Singapore: Caring For The CaretakerClaire Hendy
 
Cirugía Bucomaxilofacial
Cirugía BucomaxilofacialCirugía Bucomaxilofacial
Cirugía BucomaxilofacialDavid Tantalean
 
How to Engage Patients Using Data, Social Media and Games
How to Engage Patients Using Data, Social Media and GamesHow to Engage Patients Using Data, Social Media and Games
How to Engage Patients Using Data, Social Media and GamesDrBonnie360
 
International Internships
International InternshipsInternational Internships
International InternshipsHido99
 
Dave Roth - Context is king
Dave Roth - Context is kingDave Roth - Context is king
Dave Roth - Context is kingUX Ukraine
 
last version of cv
last version of cvlast version of cv
last version of cvmyallkoky
 
Victory Over Neck And Back Pain Dr Shriniwas Kashalikar
Victory Over Neck And Back Pain  Dr Shriniwas KashalikarVictory Over Neck And Back Pain  Dr Shriniwas Kashalikar
Victory Over Neck And Back Pain Dr Shriniwas Kashalikarsubodhnagwekar
 
Post 5 - Types of documentary
Post 5 - Types of documentaryPost 5 - Types of documentary
Post 5 - Types of documentaryasmediab15
 
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3 Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3 Puppet
 
It is the iPod's world, we just live in it.
It is the iPod's world, we just live in it.It is the iPod's world, we just live in it.
It is the iPod's world, we just live in it.Clinton Forry
 

Viewers also liked (19)

Iklim dan Budaya Organisasi
Iklim dan Budaya Organisasi Iklim dan Budaya Organisasi
Iklim dan Budaya Organisasi
 
REACT Singapore: Caring For The Caretaker
REACT Singapore: Caring For The CaretakerREACT Singapore: Caring For The Caretaker
REACT Singapore: Caring For The Caretaker
 
Water Governance
Water GovernanceWater Governance
Water Governance
 
השואה
השואההשואה
השואה
 
The city, who i want to visit
The city, who i want to visitThe city, who i want to visit
The city, who i want to visit
 
Cirugía Bucomaxilofacial
Cirugía BucomaxilofacialCirugía Bucomaxilofacial
Cirugía Bucomaxilofacial
 
How to Engage Patients Using Data, Social Media and Games
How to Engage Patients Using Data, Social Media and GamesHow to Engage Patients Using Data, Social Media and Games
How to Engage Patients Using Data, Social Media and Games
 
Lazer Angels
Lazer AngelsLazer Angels
Lazer Angels
 
International Internships
International InternshipsInternational Internships
International Internships
 
venkat edit
venkat editvenkat edit
venkat edit
 
Dave Roth - Context is king
Dave Roth - Context is kingDave Roth - Context is king
Dave Roth - Context is king
 
MCS51 Architecture
MCS51 ArchitectureMCS51 Architecture
MCS51 Architecture
 
last version of cv
last version of cvlast version of cv
last version of cv
 
Yang baru
Yang baruYang baru
Yang baru
 
Victory Over Neck And Back Pain Dr Shriniwas Kashalikar
Victory Over Neck And Back Pain  Dr Shriniwas KashalikarVictory Over Neck And Back Pain  Dr Shriniwas Kashalikar
Victory Over Neck And Back Pain Dr Shriniwas Kashalikar
 
Post 5 - Types of documentary
Post 5 - Types of documentaryPost 5 - Types of documentary
Post 5 - Types of documentary
 
CV sachin
CV sachinCV sachin
CV sachin
 
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3 Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3
Puppet Camp Seattle 2014: Docker and Puppet: 1+1=3
 
It is the iPod's world, we just live in it.
It is the iPod's world, we just live in it.It is the iPod's world, we just live in it.
It is the iPod's world, we just live in it.
 

More from Guillaume Laforge

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Guillaume Laforge
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Guillaume Laforge
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Guillaume Laforge
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Guillaume Laforge
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Guillaume Laforge
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGuillaume Laforge
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Guillaume Laforge
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Guillaume Laforge
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Guillaume Laforge
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovyGuillaume Laforge
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGuillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Guillaume Laforge
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGuillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGuillaume Laforge
 

More from Guillaume Laforge (20)

Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013Lift off with Groovy 2 at JavaOne 2013
Lift off with Groovy 2 at JavaOne 2013
 
Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013Groovy workshop à Mix-IT 2013
Groovy workshop à Mix-IT 2013
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Groovy 2 and beyond
Groovy 2 and beyondGroovy 2 and beyond
Groovy 2 and beyond
 
Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012Groovy 2.0 update at Devoxx 2012
Groovy 2.0 update at Devoxx 2012
 
Groovy 2.0 webinar
Groovy 2.0 webinarGroovy 2.0 webinar
Groovy 2.0 webinar
 
Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012Groovy Domain Specific Languages - SpringOne2GX 2012
Groovy Domain Specific Languages - SpringOne2GX 2012
 
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012Groovy 1.8 and 2.0 at GR8Conf Europe 2012
Groovy 1.8 and 2.0 at GR8Conf Europe 2012
 
Going to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific LanguagesGoing to Mars with Groovy Domain-Specific Languages
Going to Mars with Groovy Domain-Specific Languages
 
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume LaforgeGPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
GPars et PrettyTime - Paris JUG 2011 - Guillaume Laforge
 
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
Gaelyk update - Guillaume Laforge - SpringOne2GX 2011
 
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
Groovy Update, what's new in Groovy 1.8 and beyond - Guillaume Laforge - Spri...
 
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
Groovy DSLs, from Beginner to Expert - Guillaume Laforge and Paul King - Spri...
 
Cloud foundry intro with groovy
Cloud foundry intro with groovyCloud foundry intro with groovy
Cloud foundry intro with groovy
 
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume LaforgeGroovy DSLs - S2GForum London 2011 - Guillaume Laforge
Groovy DSLs - S2GForum London 2011 - Guillaume Laforge
 
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
Gaelyk - Guillaume Laforge - GR8Conf Europe 2011
 
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
Groovy 1.8 update - Guillaume Laforge - GR8Conf Europe 2011
 
Gaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume LaforgeGaelyk - JFokus 2011 - Guillaume Laforge
Gaelyk - JFokus 2011 - Guillaume Laforge
 
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume LaforgeGroovy Ecosystem - JFokus 2011 - Guillaume Laforge
Groovy Ecosystem - JFokus 2011 - Guillaume Laforge
 
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume LaforgeGroovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
Groovy and Gaelyk - Lausanne JUG 2011 - Guillaume Laforge
 

Recently uploaded

New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 

Recently uploaded (20)

New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 

Whats new in Groovy 2.0?

  • 1. Main sponsor What’s New in Groovy 2.0? Guillaume  Laforge Groovy  project  Manager
  • 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. 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. 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. 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. Command chains  turn  left    then  right   @glaforge 6
  • 7. Command chains Alternation of method names  turn  left    then  right   @glaforge 6
  • 8. Command chains Alternation of method names  turn  left    then  right   and parameters (even named ones) @glaforge 6
  • 9. Command chains  turn  left    then  right   @glaforge 6
  • 10. Command chains Equivalent to:          (        ).        (          )  turn  left    then  right   @glaforge 6
  • 11. LookM a! N op are ns, no do ts !
  • 12. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours @glaforge 8
  • 13. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours Normal argument @glaforge 8
  • 14. Command chains Before... we used to do... take  2.pills,  of:  chloroquinine,  after:  6.hours Normal argument Named arguments @glaforge 8
  • 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. Command chains Now, even less punctuation! take  2    pills  of    chloroquinine    after    6  hours @glaforge 9
  • 17. Command chains Now, even less punctuation!        (  ).          (    ).                            (          ).  (          ) take  2    pills  of    chloroquinine    after    6  hours @glaforge 9
  • 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. 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. Command chains @glaforge 12
  • 21. Command chains //  methods  with  multiple  arguments  (commas) @glaforge 12
  • 22. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor @glaforge 12
  • 23. Command chains //  methods  with  multiple  arguments  (commas) take  coffee    with  sugar,  milk    and  liquor //  leverage  named-­‐args  as  punctuation @glaforge 12
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Builtin JSON support • Consuming • Producing • Pretty-printing @glaforge 17
  • 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. 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. 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. 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. 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. @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. @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. 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. 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. 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. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  {        //  eat  lots  of  CPU } 24 @glaforge 33
  • 53. @ThreadInterrupt @ThreadInterrupt import  groovy.transform.ThreadInterrupt     while  (true)  { {        if  (Thread.currentThread.isInterrupted())                throw  new  InterruptedException() }        //  eat  lots  of  CPU } 24 @glaforge 33
  • 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. @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. @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. @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. @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. @InheritConstructors • Classes like Exception are painful when extended, as all the base constructors should be replicated class  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. @InheritConstructors • Classes like Exception are painful when extended, as all the base constructors should be replicated import  groovy.transform.* @InheritConstructors class  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. 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. 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. 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. Customizing the Groovysh prompt @glaforge 33
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Java 7 / JDK 7 • Project Coin and InvokeDynamic @glaforge 36
  • 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. 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. 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. 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. 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. 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. Typos in your variable or method import  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. Typos in your variable or method import  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. Typos in your variable or method import  groovy.transform.TypeChecked   Annotation can be at void  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. 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  =  0 i  +=  '1' @glaforge 44
  • 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  =  0 i  +=  '1' @glaforge 44
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } @glaforge 52
  • 99. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Not allowed: metaClass property is dynamic @glaforge 52
  • 100. Gotchas: runtime metaprogramming @TypeChecked   void  test()  {        Integer.metaClass.foo  =  {}        123.foo() } Method not Not allowed: recognized metaClass property is dynamic @glaforge 52
  • 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. 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. Closure shared variables @TypeChecked  test()  {        def  var  =  "abc"                      def  cl  =  {  var  =  new  Date()  }        cl()        var.toUpperCase()    //  Not  OK! } @glaforge 54
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. What about performance? Pi  (π)   Binary Fibonacci quadrature trees Java 140  ms 93  ms 4.5  s StaMc 150  ms 220  ms 7.6  s 1.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. 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. Summary ROCKS! @glaforge 63
  • 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. Q&A Got questions, really?
  • 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