Checker Framework - systémy typu Pluggable Type pre Java

1. Prehľad

Z Java 8 od vydania je možné kompilovať programy pomocou tzv Systémy zásuvného typu - ktorý môže uplatňovať prísnejšie kontroly ako tie, ktoré uplatňuje kompilátor.

Potrebujeme iba použiť anotácie poskytnuté niekoľkými Systémy zásuvného typu k dispozícii.

V tomto rýchlom článku to preskúmame rámec kontrolys láskavým dovolením University of Washington.

2. Maven

Aby sme mohli začať pracovať s Checker Frameworkom, musíme ho najskôr pridať do nášho pom.xml:

 org.checkerframework checker-qual 2.3.2 org.checkerframework checker 2.3.2 org.checkerframework jdk8 2.3.2 

Najnovšiu verziu knižníc môžete skontrolovať na serveri Maven Central.

Prvé dve závislosti obsahujú kód Rámec kontroly zatiaľ čo druhý je prispôsobená verzia Java 8 triedy, v ktorých vývojári triedy 7 správne anotovali všetky typy Rámec kontroly.

Potom musíme správne doladiť maven-compiler-plugin použit Rámec kontroly ako zásuvný Typ systému:

 maven-compiler-plugin 3.6.1 1.8 1.8 10 000 10 000 org.checkerframework.checker.nullness.NullnessChecker org.checkerframework.checker.interning.InterningChecker org.checkerframework.checker.fenum.FenumChecker org.checkerframework.checker.formatter.FormatterStore -Varuje 

Hlavným bodom je tu obsah značka. Tu sme uviedli všetky kontroly, ktoré chceme spustiť proti našim zdrojom.

3. Vyhýbajte sa NullPointerExceptions

Prvý scenár, v ktorom Rámec kontroly nám môže pomôcť identifikovať kúsok kódu, kde a NullPoinerException môže vzniknúť:

private static int countArgs (@NonNull String [] args) {return args.length; } public static void main (@Nullable String [] args) {System.out.println (countArgs (args)); }

Vo vyššie uvedenom príklade sme deklarovali s @NonNull anotácia, že args argument z countArgs () nesmie byť null.

Bez ohľadu na toto obmedzenie v hlavný(), vyvoláme metódu odovzdávajúcu argument, ktorý môže byť skutočne nulový, pretože bol anotovaný pomocou @ Nullable.

Keď zostavujeme kód, Rámec kontroly riadne nás varuje, že niečo v našom kóde nemusí byť v poriadku:

[UPOZORNENIE] /checker-plugin/.../NonNullExample.java:[12,38] [argument.type.incompatible] nekompatibilné typy v argumente. nájdené: požadovaná hodnota null: @Initialized @NonNull Reťazec @Initialized @NonNull []

4. Správne použitie konštánt ako vymenovanie

Niekedy používame sériu konštánt, pretože to boli položky výčtu.

Predpokladajme, že potrebujeme niekoľko krajín a planét. Tieto položky potom môžeme anotovať pomocou @Fenum anotácia na zoskupenie všetkých konštánt, ktoré sú súčasťou rovnakého „falošného“ výčtu:

static final @Fenum ("country") String ITALY = "IT"; static final @Fenum ("country") String US = "US"; static final @Fenum ("country") String UNITED_KINGDOM = "UK"; statické finále @Fenum ("planéta") String MARS = "Mars"; static final @Fenum ("planet") String EARTH = "Earth"; statické finále @Fenum ("planéta") Reťazec VENUS = "Venuša";

Potom, keď napíšeme metódu, ktorá by mala prijať reťazec, ktorý je „planétou“, môžeme argument správne anotovať:

void greetPlanet (@Fenum ("planet") String planet) {System.out.println ("Hello" + planet); }

Omylom môžeme vyvolať greetPlanet () s reťazcom, ktorý nebol definovaný ako možná hodnota pre planétu, napríklad:

public static void main (String [] args) {obj.greetPlanets (USA); }

Rámec kontroly všimnúť si chybu:

[UPOZORNENIE] /checker-plugin/.../FakeNumExample.java:[29,26] [argument.type.incompatible] nekompatibilné typy v argumente. found: @Fenum ("country") String required: @Fenum ("planet") String

5. Regulárne výrazy

Predpokladajme, že vieme a String premenná musí ukladať regulárny výraz s najmenej jednou zhodnou skupinou.

Môžeme využiť rámec kontroly a deklarovať takúto premennú:

@Regex (1) súkromný statický reťazec FIND_NUMBERS = "\ d *";

Je to zjavne potenciálna chyba, pretože regulárny výraz, ktorý sme priradili FIND_NUMBERS nemá žiadnu zodpovedajúcu skupinu.

Naozaj, rámec kontroly bude nás usilovne informovať o našej chybe v čase kompilácie:

[UPOZORNENIE] /checker-plugin/.../RegexExample.java:[7,51] [assignment.type.incompatible] nekompatibilné typy v priradení. nájdené: @Regex Vyžaduje sa reťazec: @Regex (1) Reťazec

6. Záver

Rámec kontroly je užitočný nástroj pre vývojárov, ktorí chcú ísť nad rámec štandardného kompilátora a vylepšiť správnosť svojho kódu.

Je schopný zistiť v čase kompilácie niekoľko typických chýb, ktoré je možné zvyčajne zistiť iba za behu programu, alebo dokonca zastaviť kompiláciu vyvolaním chyby kompilácie.

Existuje oveľa viac štandardných kontrol, ako sme sa venovali v tomto článku; pozrite sa na šeky dostupné v Rámec kontroly oficiálny manuál tu, alebo dokonca napíšte svoj vlastný.

Ako vždy, zdrojový kód tohto tutoriálu s niekoľkými ďalšími príkladmi nájdete na GitHub.