1. Gambaran keseluruhan
Dari keluaran Java 8 dan seterusnya, mungkin untuk menyusun program menggunakan apa yang disebut Sistem Jenis Pluggable - yang dapat menerapkan pemeriksaan yang lebih ketat daripada yang digunakan oleh penyusun.
Kami hanya perlu menggunakan anotasi yang disediakan oleh beberapa Sistem Jenis Pluggable yang ada.
Dalam artikel ringkas ini, kita akan meneroka Kerangka Pemeriksa , dengan ihsan dari University of Washington.
2. Maven
Untuk mula bekerja dengan Checker Framework, kita perlu terlebih dahulu menambahkannya ke pom.xml kami :
org.checkerframework checker-qual 2.3.2 org.checkerframework checker 2.3.2 org.checkerframework jdk8 2.3.2
Versi terbaru perpustakaan boleh diperiksa di Maven Central.
Dua kebergantungan pertama mengandungi kod The Checker Framework sementara yang kedua adalah versi khusus dari kelas Java 8 , di mana semua jenis telah diberi penjelasan dengan betul oleh pemaju The Checker Framework .
Kita kemudian harus mengubah plugin maven-compiler dengan betul untuk menggunakan The Checker Framework sebagai Sistem Jenis yang dapat dipasang :
maven-compiler-plugin 3.6.1 1.8 1.8 10000 10000 org.checkerframework.checker.nullness.NullnessChecker org.checkerframework.checker.interning.InterningChecker org.checkerframework.checker.fenum.FenumChecker org.checkerframework.checker.formatter.FormatterChecker -AprintErrorStack -Awarns
Perkara utama di sini adalah kandungan teg. Di sini kami menyenaraikan semua kotak yang ingin kami jalankan daripada sumber kami.
3. Mengelakkan Pengecualian NullPointer
Senario pertama di mana Kerangka Pemeriksa dapat membantu kita adalah mengenal pasti kod yang mana NullPoinerException boleh berasal:
private static int countArgs(@NonNull String[] args) { return args.length; } public static void main(@Nullable String[] args) { System.out.println(countArgs(args)); }
Dalam contoh di atas, kami menyatakan dengan anotasi @NonNull bahawa argumen argumen countArgs () tidak boleh dibatalkan.
Terlepas dari kekangan ini, pada intinya () , kami menggunakan kaedah menyampaikan argumen yang sememangnya boleh dibatalkan, kerana telah diberi penjelasan dengan @Nullable .
Semasa kami menyusun kod, Kerangka Pemeriksa sewajarnya memberi amaran kepada kami bahawa sesuatu dalam kod kami mungkin salah:
[WARNING] /checker-plugin/.../NonNullExample.java:[12,38] [argument.type.incompatible] incompatible types in argument. found : null required: @Initialized @NonNull String @Initialized @NonNull []
4. Penggunaan Pemalar yang Benar sebagai Bilangan
Kadang kala kita menggunakan rangkaian pemalar kerana ia merupakan item penghitungan.
Anggaplah kita memerlukan sebilangan negara dan planet. Kami kemudian dapat memberi anotasi item ini dengan anotasi @Fenum untuk mengelompokkan semua pemalar yang merupakan sebahagian daripada penghitungan "palsu" yang sama:
static final @Fenum("country") String ITALY = "IT"; static final @Fenum("country") String US = "US"; static final @Fenum("country") String UNITED_KINGDOM = "UK"; static final @Fenum("planet") String MARS = "Mars"; static final @Fenum("planet") String EARTH = "Earth"; static final @Fenum("planet") String VENUS = "Venus";
Setelah itu, ketika kita menulis metode yang harus menerima String yang merupakan "planet", kita dapat memberi penjelasan dengan tepat pada argumennya:
void greetPlanet(@Fenum("planet") String planet){ System.out.println("Hello " + planet); }
Secara tidak sengaja , kita boleh memanggil SalamPlanet () dengan rentetan yang belum didefinisikan sebagai nilai yang mungkin untuk planet, seperti:
public static void main(String[] args) { obj.greetPlanets(US); }
Kerangka Pemeriksa dapat melihat ralat:
[WARNING] /checker-plugin/.../FakeNumExample.java:[29,26] [argument.type.incompatible] incompatible types in argument. found : @Fenum("country") String required: @Fenum("planet") String
5. Ungkapan Biasa
Katakan kita tahu bahawa pemboleh ubah String harus menyimpan ungkapan biasa dengan sekurang-kurangnya satu kumpulan yang sepadan.
Kami dapat memanfaatkan Checker Framework dan menyatakan pemboleh ubah seperti itu:
@Regex(1) private static String FIND_NUMBERS = "\\d*";
Ini jelas merupakan ralat yang berpotensi kerana ungkapan biasa yang kami tetapkan kepada FIND_NUMBERS tidak mempunyai kumpulan yang sepadan.
Sesungguhnya, Kerangka Pemeriksa dengan tekun akan memberitahu kami tentang kesilapan kami pada waktu penyusunan:
[WARNING] /checker-plugin/.../RegexExample.java:[7,51] [assignment.type.incompatible] incompatible types in assignment. found : @Regex String required: @Regex(1) String
6. Kesimpulannya
Kerangka Pemeriksa adalah alat yang berguna untuk pembangun yang ingin melampaui penyusun standard dan meningkatkan ketepatan kod mereka.
Ia dapat mengesan, pada waktu kompilasi, beberapa kesalahan tipikal yang biasanya hanya dapat dikesan pada waktu berjalan atau bahkan menghentikan penyusunan dengan menimbulkan kesalahan kompilasi.
Terdapat lebih banyak pemeriksaan standard daripada yang kami bahas dalam artikel ini; periksa cek yang terdapat di manual rasmi The Checker Framework di sini, atau tulis sendiri.
Seperti biasa, kod sumber untuk tutorial ini, dengan beberapa contoh lagi, boleh didapati di GitHub.