A Checker Framework - Pluggable Type Systems for Java
1. Áttekintés
Tól Java 8 kiadástól kezdve programokat lehet összeállítani az ún Dugaszolható típusú rendszerek - amely szigorúbb ellenőrzéseket alkalmazhat, mint a fordító.
Csak a többen által megadott feljegyzéseket kell használnunk Dugaszolható típusú rendszerek elérhető.
Ebben a rövid cikkben feltárjuk a Checker Framework, a Washingtoni Egyetem jóvoltából.
2. Maven
A Checker Framework használatának megkezdéséhez először hozzá kell adnunk azt a mi pom.xml:
org.checkerframework checker-qual 2.3.2 org.checkerframework checker 2.3.2 org.checkerframework jdk8 2.3.2
A könyvtárak legújabb verziója a Maven Central oldalon ellenőrizhető.
Az első két függőség a. Kódját tartalmazza A Checker Framework míg az utóbbi a Java 8 osztályok, amelyekben minden típust megfelelően jegyzeteltek a A Checker Framework.
Ezután megfelelően be kell állítanunk a maven-compiler-plugin használni A Checker Framework bedughatóként Típus Rendszer:
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 - Figyelmeztet
A fő szempont itt a címke. Itt felsoroltuk az összes ellenőrzőt, akikkel a forrásaink ellen akarunk futni.
3. Kerülje a NullPointerExceptions alkalmazást
Az első forgatókönyv, amelyben A Checker Framework segíthet azonosítani a kódrészletet, ahol a NullPoinerException származhat:
private static int countArgs (@NonNull String [] args) {return args.hossz; } public static void main (@Nullable String [] args) {System.out.println (countArgs (args)); }
A fenti példában a @NonNull feljegyzés, hogy a érvel érvelése countArgs () nem lehet semleges.
Ettől a megszorítástól függetlenül a fő(), meghívjuk a metódust egy olyan argumentum átadásával, amely valóban null lehet, mert azzal annotálták @Nullable.
Amikor összeállítjuk a kódot, A Checker Framework megfelelően figyelmeztet bennünket arra, hogy a kódunkban valami baj lehet:
[FIGYELMEZTETÉS] /checker-plugin/.../NonNullExample.java:[12,38] [argumentumtípus.egyeztethetetlen] inkompatibilis típusok az argumentumban. talált: null szükséges: @Initialized @NonNull karakterlánc @Initialized @NonNull []
4. Az állandók helyes használata felsorolásként
Néha konstansok sorozatát használjuk, mivel felsorolás tárgyai voltak.
Tegyük fel, hogy szükségünk van egy sor országra és bolygóra. Ezután ezeket az elemeket feljegyezhetjük a @Fenum kommentár az összes konstans csoportosításához, amelyek ugyanazon „hamis” felsorolás részét képezik:
statikus végleges @Fenum ("ország") karakterlánc OLASZORSZÁG = "IT"; statikus végleges @Fenum ("ország") Karakterlánc US = "US"; statikus végleges @Fenum ("ország") karakterlánc UNITED_KINGDOM = "UK"; statikus végleges @Fenum ("bolygó") húr MARS = "Mars"; statikus végleges @Fenum ("bolygó") Sztring FÖLD = "Föld"; statikus végleges @Fenum ("bolygó") Húr VENUS = "Vénusz";
Ezt követően, amikor olyan metódust írunk, amelynek el kell fogadnia egy „bolygó” karakterláncot, megfelelően feljegyezhetjük az érvet:
void greetPlanet (@Fenum ("bolygó") String bolygó) {System.out.println ("Hello" + bolygó); }
Tévedésből hivatkozhatunk greetPlanet () olyan karakterlánccal, amelyet nem határoztak meg egy bolygó lehetséges értékeként, például:
public static void main (String [] args) {obj.greetPlanets (USA); }
A Checker Framework észlelheti a hibát:
[FIGYELMEZTETÉS] /checker-plugin/.../FakeNumExample.java:[29,26] [argumentumtípus.egyeztethetetlen] inkompatibilis típusok az argumentumban. talált: @Fenum ("ország") Szöveg szükséges: @Fenum ("bolygó") karakterlánc
5. Reguláris kifejezések
Tegyük fel, hogy tudjuk a Húr a változónak szabályos kifejezést kell tárolnia legalább egy egyező csoporttal.
Kihasználhatjuk a Checker Framework és deklarálja az ilyen változót:
@Regex (1) privát statikus karakterlánc FIND_NUMBERS = "\ d *";
Ez nyilvánvalóan potenciális hiba, mert a reguláris kifejezés, amelyet hozzárendeltünk FIND_NUMBERS nincs egyező csoportja.
Valóban, a Checker Framework szorgalmasan tájékoztat bennünket hibánkról a fordítás idején:
[FIGYELEM] /checker-plugin/.../RegexExample.java:[7,51] [assignment.type.incompatible] inkompatibilis típusok a hozzárendelésben. talált: @Regex karakterlánc szükséges: @Regex (1) karakterlánc
6. Következtetés
A Checker Framework hasznos eszköz azoknak a fejlesztőknek, akik túl akarnak lépni a standard fordítón és javítani akarják a kódjuk helyességét.
Fordításkor képes felismerni több tipikus hibát, amelyek általában csak futás közben észlelhetők, vagy akár leállíthatják a fordítást fordítási hiba felvetésével.
Sokkal több szabványos ellenőrzés van, mint amire ebben a cikkben kitértünk; nézze meg a A Checker Framework hivatalos kézikönyvet itt, vagy akár a sajátját is írhatja.
Mint mindig, az oktatóanyag forráskódja, néhány további példával együtt megtalálható a GitHubon.