Anotasi Seperti yang kita ketahui, fitur ini telah ditambahkan sejak Java5, dan kini telah berkembang di mana-mana. Fitur ini banyak digunakan di banyak kerangka kerja untuk menyederhanakan konfigurasi program. Jadi apa sebenarnya jenis anotasi kontroversial itu? Kompleks atau nyaman?
1. Apa yang dimaksud dengan anotasi tipe?
Sebelum Java 8, anotasi hanya dapat digunakan di tempat yang dideklarasikan, seperti kelas, metode, dan properti; di Java 8, anotasi dapat diterapkan di mana saja, seperti:
Buat instance kelas
Salin kode sebagai berikut: new @Interned MyObject();
tipe pemetaan
Copy kode sebagai berikut: myString = (@NonNull String) str;
dalam pernyataan implementasi
Salin kode sebagai berikut: class UnmodifiedList<T> mengimplementasikan @Readonly List<@Readonly T> { ... }
melempar pernyataan pengecualian
Salin kode sebagai berikut: void monitorTemperature() throws @Critical TemperatureException { ... }
Perlu dicatat bahwa anotasi tipe hanya bersifat sintaksis, bukan semantik, dan tidak akan memengaruhi waktu kompilasi Java, waktu pemuatan, dan waktu berjalan. Dengan kata lain, anotasi tipe tidak disertakan saat dikompilasi ke dalam file kelas.
2. Peran anotasi tipe
Perhatikan kode berikut terlebih dahulu:
Copy kode kodenya sebagai berikut:
Koleksi.emptyList().add("Satu");
int i=Bilangan Bulat.parseInt("halo");
Sistem.konsol().readLine();
Kode di atas berhasil dikompilasi, tetapi saat dijalankan, UnsupportedOperationException; NumberFormatException; NullPointerException akan dilaporkan masing-masing.
Anotasi tipe digunakan untuk mendukung pemeriksaan tipe yang kuat dalam program Java. Dengan kerangka pemeriksaan plug-in, kesalahan runtime dapat dideteksi selama kompilasi untuk meningkatkan kualitas kode. Ini adalah peran anotasi tipe.
3. periksa kerangka
Periksa kerangka kerja adalah alat pihak ketiga, dan efek penggunaan anotasi tipe Java adalah 1+1>2. Itu dapat ditanamkan ke dalam kompiler javac, digunakan dengan ant dan maven, atau sebagai plug-in Eclipse. Alamatnya adalah http://types.cs.washington.edu/checker-framework/.
Kerangka pemeriksaan dapat menemukan di mana anotasi tipe muncul dan memeriksanya. Berikut adalah contoh sederhana:
Copy kode kodenya sebagai berikut:
import checkers.nullness.quals.*;
kelas publik Memulai {
batalkan sampel() {
@NonNull Objek ref = Objek baru();
}
}
Gunakan javac untuk mengkompilasi kelas di atas
Copy kode kodenya sebagai berikut:
javac -prosesor checkers.nullness.NullnessChecker GetStarted.java
Kompilasi lolos, tetapi jika diubah menjadi:
Copy kode kodenya sebagai berikut:
@NonNull Objek ref = null;
Jika Anda tidak ingin menggunakan anotasi tipe untuk mendeteksi kesalahan, Anda tidak memerlukan prosesor. Javac langsung GetStarted.java dapat dikompilasi dan diteruskan. Hal ini dimungkinkan di Java 8 dengan versi Dukungan Anotasi Tipe, tetapi tidak di Versi Java 5, 6, dan 7. Karena kompiler javac tidak mengetahui apa itu @NonNull, tetapi kerangka pemeriksaan memiliki solusi yang kompatibel, yaitu membubuhi keterangan tipe anotasi nonnull dengan /**/
, misalnya contoh di atas diubah menjadi:
Copy kode kodenya sebagai berikut:
import checkers.nullness.quals.*;
kelas publik Memulai {
batalkan sampel() {
/*@NonNull*/ Referensi objek = null;
}
}
Dengan cara ini, kompiler javac akan mengabaikan blok komentar, tetapi kompiler javac dalam kerangka pemeriksaan juga dapat mendeteksi kesalahan nonnull.
Melalui tipe anotasi + periksa kerangka kerja kita dapat melihat bahwa kesalahan runtime sekarang dapat ditemukan pada waktu kompilasi.
4. Tentang JSR 308
JSR 308 berupaya mengatasi dua masalah yang muncul dalam anotasi Java 1.5:
1. Pembatasan sintaksis pada anotasi: anotasi hanya dapat ditulis jika anotasi tersebut dideklarasikan
2. Batasan semantik dari sistem tipe: Sistem tipe tidak dapat mencegah semua bug.
JSR 308 menyelesaikan dua masalah di atas melalui metode berikut:
1. Perluas sintaks bahasa Java untuk memungkinkan anotasi muncul di lebih banyak posisi. Termasuk: penerima metode, parameter generik, array, konversi tipe, pengujian tipe, pembuatan objek, pengikatan parameter tipe, pewarisan kelas, dan klausa lemparan. Faktanya, ini adalah anotasi tipe, yang sekarang menjadi fitur Java 8
2. Pemroses anotasi yang lebih kuat dapat dibuat dengan memperkenalkan sistem tipe pluggable. Pemeriksa tipe menganalisis kode sumber dengan anotasi kualifikasi tipe, dan akan menghasilkan pesan peringatan jika ditemukan kesalahan seperti ketidakcocokan. Faktanya, ini adalah kerangka pemeriksaan
Beberapa orang keberatan dengan JSR308, karena menganggapnya lebih kompleks dan statis, seperti
Salin kode sebagai berikut: @NotEmpty List<@NonNull String> strings = new ArrayList<@NonNull String>()>
Ubah ke bahasa dinamis sebagai
Salin kode sebagai berikut: var strings = ["satu", "dua"];
Beberapa orang setuju bahwa, pada analisis akhir, kode adalah dokumen "paling mendasar". Anotasi yang disertakan dalam kode dengan jelas menunjukkan maksud orang yang menulis kode tersebut. Jika tidak diperbarui tepat waktu atau ada kelalaian, justru informasi yang dimaksud yang terkandung dalam anotasilah yang kemungkinan besar akan hilang di dokumen lain. Selain itu, memindahkan kesalahan runtime ke tahap kompilasi tidak hanya dapat mempercepat proses pengembangan, tetapi juga menghemat waktu dalam memeriksa bug selama pengujian.
5. Ringkasan
Tidak semua orang menyukai fitur ini, terutama saat ini ketika bahasa dinamis lebih populer. Untungnya, Java 8 tidak memaksa semua orang untuk menggunakan fitur ini. Mereka yang keberatan tidak dapat menggunakan fitur ini, tetapi beberapa orang yang memiliki persyaratan kualitas kode yang lebih tinggi Atau perusahaan dapat mengadopsi JSR 308. Bagaimanapun, kode adalah dokumen "paling dasar". Meskipun kodenya akan bertambah, hal ini dapat membuat kode Anda lebih ekspresif. Setiap orang memiliki pendapatnya masing-masing tentang pendapatnya tentang fitur ini. .