Pertanyaan Perbedaan antara @TypeChecked dan @CompileStatic


Dapatkah seseorang menjelaskan perbedaan antara @TypeChecked dan @CompileStatic?

Saya membaca bahwa dengan @TypeChecked tidak mungkin untuk menambahkan metode baru saat runtime. Apa fitur lain yang tidak diizinkan?

Fitur Groovy mana yang diizinkan dengan @CompileStatic? Apakah bytecode sama dengan yang dikompilasi dengan javac dibandingkan dengan groovyc dan @CompileStatic?


32
2017-11-17 11:21


asal


Jawaban:


Perbedaan utamanya adalah MOP (Meta Object Protocol): @TypeChecked menjaga metode melalui MOP, sementara @CompileStatic menghasilkan panggilan metode yang mirip dengan bytecode Java. Ini berarti semantik mereka berbeda, tetapi itu juga berarti Anda masih dapat menerapkan metaprogramming di atas a @TypeChecked kode, selama pemanggilan metode dapat diselesaikan pada waktu kompilasi.

Kode berikut menunjukkan MOP yang beraksi pada a @TypeChecked kode, dan tidak aktif @CompileStatic kode:

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"

Untuk @CompileStatic, ya, Groovy mencoba menghasilkan bytecode dekat dengan apa javac akan menghasilkan, dengan demikian, kinerja mereka sangat dekat, dengan beberapa pengecualian.


(Diperbarui 2016-01-13)

Kedua @CompileStatic dan @TypeChecked akan memperbolehkan:

  • Penutupan (termasuk delegasi Penutupan melalui @DelegatesTo);
  • AST (yang dapat digunakan untuk metaprogramming kompilasi);
  • Gula sintetik Groovy, seperti yang ada pada regex, daftar, peta, kelebihan operator, dan sebagainya;
  • Ekstensi.

Untuk @TypeChecked, Anda juga dapat menginstruksikan kompiler untuk mengabaikan beberapa jenis pemeriksaan melalui Ketik Memeriksa Ekstensi, memungkinkan lebih banyak fleksibilitas. @CompileStatic juga mendukung ini, tetapi adalah a sedikit lebih membatasi.


37
2017-11-17 13:44



tl / dr;

  • @TypeChecked hanya memeriksa jenis selama kompilasi, tetapi kode yang dikompilasi berperilaku sama tanpa @TypeChecked
  • @CompileStatic cek serupa dengan @TypeChecked, tetapi juga memodifikasi kode untuk menjadi tipe-aman saat runtime, yang berarti metode menggunakan pemrograman dinamis akan rusak.

4
2017-12-15 05:12