Pregunta Diferencia entre @TypeChecked y @CompileStatic


¿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?


32
2017-11-17 11:21


origen


Respuestas:


La principal diferencia es el MOP (Meta Object Protocol): @TypeChecked mantener los métodos pasando por el MOP, mientras @CompileStatic generar llamadas a métodos 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 una @TypeChecked código, siempre que la llamada al método se pueda resolver en tiempo de compilación.

El siguiente código muestra el MOP actuando en un @TypeChecked código, y no en @CompileStatic código:

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"

por @CompileStatic, sí, Groovy intenta generar bytecode cerca de lo que javac saldría, por lo tanto, su rendimiento es muy cercanocon algunas excepciones


(Actualizado el 13/01/2016)

Ambos @CompileStatic y @TypeChecked permitirá:

  • 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;
  • Extensiones.

por @TypeChecked, también puede indicarle al compilador que ignore algunas comprobaciones de tipo a través de un Tipo Verificación de extensiones, permitiendo más flexibilidad. @CompileStatic también lo soportan, pero es un poco más restrictivo.


37
2017-11-17 13:44



tl / dr;

  • @TypeChecked simplemente comprueba los tipos durante la compilación, pero el código compilado se comporta igual que sin @TypeChecked
  • @CompileStatic controles similares 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.

4
2017-12-15 05:12