– Mejores DSLs con command chains
Una sintaxis mejorada en donde puedes eliminar puntos y paréntesis cuando encadenas varias llamadas a métodos.
– Mejoras en el rendimiento en tiempo de ejecución
– GPars está ya agrupado dentro de la distribución de Groovy
– Mejoras en las Closures
Anotaciones con closures como parámetros y método memoize() en closures para cachear un número de invocaciones.
– Soporte mejorado para la producción, construcción e impresión de JSON
– Nuevas transformaciones AST
4 loggers diferentes pueden ser inyectados (@Log, @Commons, @Log4j y @Slf4j) o posiblidad de implementar tu propia estrategia.
import groovy.util.logging.* @Log class Car{ Car() { log.info 'Car constructed' } } def car = new Car()@Field
@AutoClone y @AutoExternalizable
@Canonical
@toString: para crear un método toString() a tus tipos.
import groovy.transform.ToString @ToString class Person { String name int age } println new Person(name:'Edu', age:31) // => Person(Edu,31)@EqualsAndHashCode: para crear una implemetación por defecto de equals() y hashCode()
import groovy.transform.EqualsAndHashCode @EqualsAndHashCode class Coord { int x, y } def c1 = new Coord(x:20,y:10) def c2 = new Coord(x:20,y:10) assert c1==c2 assert c1.hashCode()==c2.hashCode()@TupleConstructor: crea un clásico constructor con todas las propiedades
import groovy.transform.TupleConstructor class Person { String name int age } def person = new Person(name:'Edu', age:31) assert person.name=='Edu' assert person.age==31Controlar la ejecución del código para cuando el código entra en un bucle infinito o consume muchos recursos. Se hace con las 3 nuevas anotaciones: @ThreadInterrupt, @TimeInterrupt y @ConditionalInterrupt.
import groovy.transform.ThreadInterrupt @ThreadInterrupt void main(){ while(true){ if(Thread.currentThread().isInterrupted()) throw new InterruptedException() //eat lots of CPU } }@InheritConstructor: para que se pinten todos los constructores heredados
@WithReadLock y @WithWriteLock
@ListenerList
Lo nuevo de Groovy 2.0 (NO INCLUIDO EN GRAILS 2):
– Alineaciones con JDK 7: Proyecto Coin (Binary literals, Underscore en literales y Multicatch) y InvokeDynamic ()
//Ejemplo de Multicatch try{ ... }catch(IOException | NullPointerException e){ //Un bloque para tratar 2 excepciones }– Continuan las mejoras de rendimiento en tiempo de ejecución
– Modularidad (todos los jars de Groovy pesan 6 Mb, con un pequeño core (3 Mb) y un pequeño jar por feature)
console – jsr-223 – test – docgenerator – jmx – testng – groovydoc – sql – json – groovysh – swing – xml – ant – servlet – bsf – templates.
Dejaremos las dos más importantes features para el final: static type checking y static compilation.
@TypeChecked
Puede estar a nivel de clase o de método. Ayuda a comprobar errores de compilación (no en tiempo de ejecución). No todo el tiempo necesitas las features dinámicas. Comprueba tipos en métodos y variables, asignaciones erroneas, tipos devueltos erroneos y tipos heredados.
import groovy.transform.TypeChecked void method() { ... } @TypeChecked test() { // No se puede encontrar el método metthhoood() metthhoood() def name = "Eduuuuuu" // Variable naamme no está declarada println naamme }La anotación @TypeChecked funciona en tiempo de compilación y no cambia el comportamiento del código. La mayoría de las features dinámicas no pueden ser @TypeChecked. Sin embargo, la metaprogramación funciona en tiempo de compilación.
@CompileStatic
Esto quiere decir que todo el código se compila estáticamente, es decir genera el mismo byte code que si lo compilásemos con javac.
Ventajas que consigues:
- Tipado seguro
- Código más rápido (casi a la altura de Java)
- Código inmune
- Byte code generado más pequeño
Desventajas
- Pierdes las features dinámicas
- Pierdes el método dispatch
import groovy.transform.CompileStatic @CompileStatic test() { ... }
No hay comentarios:
Publicar un comentario