Подтвердить что ты не робот

Разница между @TypeChecked и @CompileStatic

Может кто-нибудь объяснить разницу между @TypeChecked и @CompileStatic?

Я прочитал, что при @TypeChecked невозможно добавить новые методы во время выполнения. Какие еще функции не допускаются?

Какие функции Groovy разрешены с помощью @CompileStatic? Является ли байт-код таким же, как и с javac в сравнении с groovyc и @CompileStatic?

4b9b3361

Ответ 1

Основное отличие: MOP (Meta Object Protocol): @TypeChecked сохранять методы, проходящие через MOP, а @CompileStatic генерировать вызовы методов, похожие на байт-код Java. Это означает, что их семантика различна, но это также означает, что вы все еще можете применять метапрограммирование поверх кода @TypeChecked, если вызов метода может быть разрешен во время компиляции.

Следующий код показывает MOP, действующий на код @TypeChecked, а не на @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"

Для @CompileStatic да, Groovy пытается сгенерировать байт-код, близкий к тому, что будет выводить javac, поэтому их производительность очень близка., за некоторыми исключениями.


(Обновлено 2016-01-13)

Оба @CompileStatic и @TypeChecked позволят:

Для @TypeChecked вы также можете дать указание компилятору игнорировать некоторые проверки типов с помощью Type Checking Extensions, что обеспечивает большую гибкость. @CompileStatic также поддерживает это, но немного более ограничительный.

Ответ 2

TL/дг;

  • @TypeChecked просто проверяет типы во время компиляции, но скомпилированный код ведет себя так же, как без @TypeChecked
  • @CompileStatic проверяет аналогично @TypeChecked, но также изменяет код, который должен быть безопасным для текста во время выполнения, что означает, что методы, использующие динамическое программирование, будут нарушены.