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.