Durante a discussão começamos a trocar idéias sobre um recurso muito interessante da linguagem:
A possibilidade de interceptar a chamada de um método não existente de um objeto e fazer com que o mesmo faça algo de útil.
Como nós dois adoramos programação concorrente, o primeiro exemplo que nos veio a mente foi o de passar o processamento de um método de síncrono para assíncrono utilizando apenas convenção de código, escondendo assim a criação de um Runnable para encapsular o método e tornando isso algo mais transparente.
Ao final da discução o seguinte código foi criado, o mesmo é bem simples e é somente uma prova de conceito, mas é excelente pra mostrar a idéia.
E vocês, também acham isso fascinante?
class A { def b( String name ){ for( int i=0; i<15; i++ ) println( name + i ) } def invokeMethod( String name, args ){ if( name.endsWith("Async") ){ name = name.substring( 0, name.size()-5 ); def m = A.metaClass.getMetaMethod(name, args) if( m == null ){ println( "1. Nothing to do! No method definition found!" ) return } def t = { println( "Invoking $name in asyn way" ) m.invoke(this,args) } as Runnable def t1 = new Thread(t) t1.start() } else { println( "2. Nothing to do! No method definition found!" ) } } } def a = new A() a.Async("t1") a.c() a.cAsync("t2") a.b("name") a.bAsync("t3") a.bAsync("t4") a.bAsync("t5") a.bAsync("t6") a.bAsync("t7") a.bAsync("t8") a.bAsync("t9") a.bAsync("t10") a.bAsync("t11") a.bAsync("t12") a.bAsync("t13") a.bAsync("t14") a.bAsync("t15")