Checker Framework - Pluggable Type Systems til Java

1. Oversigt

Fra Java 8 frigivelse og videre, er det muligt at kompilere programmer ved hjælp af den såkaldte Tilslutbare systemsystemer - som kan anvende strengere kontrol end dem, der anvendes af compileren.

Vi behøver kun at bruge kommentarerne fra de forskellige Systemer, der kan tilsluttes ledig.

I denne hurtige artikel undersøger vi Checker Framework, med tilladelse fra University of Washington.

2. Maven

For at begynde at arbejde med Checker Framework skal vi først tilføje det i vores pom.xml:

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

Den seneste version af bibliotekerne kan kontrolleres på Maven Central.

De to første afhængigheder indeholder koden for Checker Framework mens sidstnævnte er en brugerdefineret version af Java 8 klasser, hvor alle typer er korrekt kommenteret af udviklerne af Checker Framework.

Vi er derefter nødt til at finjustere maven-compiler-plugin at bruge Checker Framework som en stikbar Skriv system:

 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 -Advarsler 

Hovedpointen her er indholdet af tag. Her har vi listet alle de brikker, som vi vil køre mod vores kilder.

3. Undgå NullPointerExceptions

Det første scenario, hvor Checker Framework kan hjælpe os med at identificere det stykke koder, hvor en NullPoinerException kunne stamme:

privat statisk int countArgs (@NonNull String [] args) {return args.length; } offentlig statisk ugyldig hoved (@Nullable String [] args) {System.out.println (countArgs (args)); }

I ovenstående eksempel erklærede vi med @NonNull bemærkning om, at argumenterer argument af countArgs () skal ikke være nul.

Uanset denne begrænsning, i hoved (), påkalder vi metoden, der sender et argument, der faktisk kan være nul, fordi det er blevet kommenteret med @Nullable.

Når vi kompilerer koden, Checker Framework advarer os behørigt om, at noget i vores kode kan være forkert:

[ADVARSEL] /checker-plugin/.../NonNullExample.java: [12,38] [argument.type.incompatible] inkompatible typer i argumentet. fundet: null kræves: @Initialized @NonNull String @Initialized @NonNull []

4. Korrekt anvendelse af konstanter som optællinger

Nogle gange bruger vi en række konstanter, da de var genstand for en optælling.

Lad os antage, at vi har brug for en række lande og planeter. Vi kan derefter kommentere disse emner med @Fenum kommentar til at gruppere alle konstanter, der er en del af den samme "falske" optælling:

statisk endelig @Fenum ("land") Streng ITALIEN = "IT"; statisk endelig @Fenum ("land") String US = "US"; statisk endelig @Fenum ("land") String UNITED_KINGDOM = "UK"; statisk endelig @Fenum ("planet") String MARS = "Mars"; statisk endelig @Fenum ("planet") String JORD = "Jorden"; statisk endelig @Fenum ("planet") String VENUS = "Venus";

Derefter, når vi skriver en metode, der skal acceptere en streng, der er en "planet", kan vi korrekt kommentere argumentet:

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

Ved en fejl kan vi påberåbe os greetPlanet () med en streng, der ikke er defineret som en mulig værdi for en planet, såsom:

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

Checker Framework kan se fejlen:

[ADVARSEL] /checker-plugin/.../FakeNumExample.java: [29,26] [argument.type.incompatible] inkompatible typer i argumentet. fundet: @Fenum ("land") Streng krævet: @Fenum ("planet") Streng

5. Regulære udtryk

Lad os antage, at vi kender en Snor variabel skal gemme et regulært udtryk med mindst en matchende gruppe.

Vi kan udnytte Checker Framework og erklær sådan en variabel sådan:

@Regex (1) privat statisk streng FIND_NUMBERS = "\ d *";

Dette er naturligvis en potentiel fejl, fordi det regulære udtryk, vi tildelte FIND_NUMBERS har ingen matchende gruppe.

Ja, Checker Framework vil flittigt informere os om vores fejl på kompileringstidspunktet:

[ADVARSEL] /checker-plugin/.../RegexExample.java: [7,51] [assignment.type.incompatible] inkompatible typer i opgaven. fundet: @Regex streng krævet: @Regex (1) streng

6. Konklusion

Checker Framework er et nyttigt værktøj til udviklere, der ønsker at gå ud over standard compileren og forbedre korrektheden af ​​deres kode.

Det er i stand til, på kompileringstidspunktet, at opdage flere typiske fejl, der normalt kun kan detekteres ved kørsel eller endda stoppe kompilering ved at rejse en kompileringsfejl.

Der er mange flere standardkontrol end hvad vi dækkede i denne artikel; tjek de tilgængelige kontroller i Checker Framework officiel manual her, eller skriv endda din egen.

Som altid kan kildekoden til denne vejledning med nogle flere eksempler findes på GitHub.