tutorial traduccion peliculas friends app groovy

peliculas - groovy traduccion



Diferencia entre @TypeChecked y @CompileStatic (2)

¿Alguien puede explicar la diferencia entre @TypeChecked y @CompileStatic?

Leí que con @TypeChecked no es posible agregar nuevos métodos en tiempo de ejecución. ¿Qué otras características no están permitidas?

¿Qué funciones de Groovy están permitidas con @CompileStatic? ¿El bytecode es el mismo que el compilado con javac en comparación con Groovyc y @CompileStatic?


tl / dr;

  • @TypeChecked solo comprueba los tipos durante la compilación, pero el código compilado se comporta igual que sin @TypeChecked
  • @CompileStatic comprueba de forma similar a @TypeChecked , pero también modifica el código para que sea seguro en tiempo de ejecución, lo que significa que los métodos que usan programación dinámica se romperán.

La principal diferencia es el MOP (Meta Object Protocol): @TypeChecked mantiene los métodos pasando por el MOP, mientras que @CompileStatic genera llamadas de método similares al bytecode de Java. Esto significa que su semántica es diferente, pero también significa que aún puede aplicar la metaprogramación sobre un código @TypeChecked , siempre que la llamada al método se pueda resolver en tiempo de compilación.

El siguiente código muestra que el MOP actúa sobre un código @TypeChecked , y no sobre el código @CompileStatic :

import groovy.transform.CompileStatic as CS import groovy.transform.TypeChecked as TC class Foo { def bar = "bar" } class TestTC { Foo foo TestTC() { foo = new Foo() foo.metaClass.getBar = { "metaClass''d bar" } } @TC def typed() { foo.bar } @CS def compiled() { foo.bar } } assert new TestTC().typed() == "metaClass''d bar" assert new TestTC().compiled() == "bar"

Para @CompileStatic , sí, Groovy intenta generar bytecode cerca de lo que javac generaría, por lo tanto, su rendimiento es muy cercano , con algunas excepciones.

(Actualizado el 13/01/2016)

Tanto @CompileStatic como @TypeChecked permitirán:

  • Cierres (incluidas las delegaciones de Cierre a través de @DelegatesTo );
  • AST (que se pueden usar para metaprogramación en tiempo de compilación );
  • Azúcar sintáctico de Groovy, como los de expresiones regulares, listas, mapas, sobrecarga del operador y cosas por el estilo;
  • Extensions

Para @TypeChecked , también puede indicar al compilador que @TypeChecked caso omiso de algunas comprobaciones de tipo a través de las Extensiones de comprobación de tipo , lo que permite una mayor flexibilidad. @CompileStatic también lo admite, pero es un poco más restrictivo .