The Checker Framework - Pluggable Type Systems for Java

1. Oversikt

Fra Java 8 utgivelse videre, er det mulig å kompilere programmer ved hjelp av den såkalte Pluggbare type systemer - som kan bruke strengere kontroller enn de som kompilatoren bruker.

Vi trenger bare å bruke kommentarene som er gitt av flere Pluggbare type systemer tilgjengelig.

I denne raske artikkelen vil vi utforske Checker Framework, med tillatelse fra University of Washington.

2. Maven

For å begynne å jobbe med Checker Framework, må vi først legge det til i vårt pom.xml:

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

Den siste versjonen av bibliotekene kan sjekkes på Maven Central.

De to første avhengighetene inneholder koden for Checker Framework mens sistnevnte er en tilpasset versjon av Java 8 klasser, der alle typer er skikkelig kommentert av utviklerne av Checker Framework.

Vi må da finjustere maven-compiler-plugin å bruke Checker Framework som en pluggbar Skriv inn 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 -Advarer 

Hovedpoenget her er innholdet i stikkord. Her har vi listet opp alle brikkene vi vil kjøre mot kildene våre.

3. Unngå NullPointerExceptions

Det første scenariet der Checker Framework kan hjelpe oss med å identifisere kodebiten der 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 eksemplet ovenfor erklærte vi med @NonNull kommentar om at argumenterer argument av countArgs () må ikke være null.

Uavhengig av denne begrensningen, i hoved(), påkaller vi metoden som sender et argument som faktisk kan være null, fordi det er merket med @Nullable.

Når vi kompilerer koden, Checker Framework advarer oss behørig om at noe i koden kan være galt:

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

4. Riktig bruk av konstanter som oppregninger

Noen ganger bruker vi en serie konstanter som de var gjenstander for en oppregning.

La oss anta at vi trenger en serie land og planeter. Vi kan deretter kommentere disse elementene med @Fenum kommentar for å gruppere alle konstantene som er en del av den samme "falske" oppregningen:

statisk finale @Fenum ("land") String ITALIA = "IT"; statisk finale @Fenum ("land") String US = "US"; statisk finale @Fenum ("land") String UNITED_KINGDOM = "UK"; statisk finale @Fenum ("planet") String MARS = "Mars"; statisk finale @Fenum ("planet") String JORD = "Jord"; statisk finale @Fenum ("planet") String VENUS = "Venus";

Etter det, når vi skriver en metode som skal akseptere en streng som er en "planet", kan vi ordentlig kommentere argumentet:

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

Ved en feil kan vi påberope oss greetPlanet () med en streng som ikke er definert som en mulig verdi for en planet, for eksempel:

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

Checker Framework kan oppdage feilen:

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

5. Vanlige uttrykk

La oss anta at vi vet a String variabel må lagre et vanlig uttrykk med minst en matchende gruppe.

Vi kan utnytte Checker Framework og erklære en slik variabel slik:

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

Dette er åpenbart en potensiell feil fordi det vanlige uttrykket vi tildelte FIND_NUMBERS har ingen matchende gruppe.

Faktisk, Checker Framework vil flittig informere oss om feilen vår på kompileringstidspunktet:

[ADVARSEL] /checker-plugin/.../RegexExample.java: [7,51] [assignment.type.incompatible] inkompatible typer i oppgaven. funnet: @Regex streng nødvendig: @Regex (1) streng

6. Konklusjon

Checker Framework er et nyttig verktøy for utviklere som ønsker å gå utover standard kompilatoren og forbedre korrektheten i koden.

Det er i stand til å oppdage, på kompileringstidspunktet, flere typiske feil som vanligvis bare kan oppdages ved kjøretid eller til og med stoppe kompilering ved å heve en kompileringsfeil.

Det er mange flere standardkontroller enn det vi dekket i denne artikkelen; sjekk ut sjekkene som er tilgjengelige i Checker Framework offisiell manual her, eller til og med skrive din egen.

Som alltid kan kildekoden for denne opplæringen, med noen flere eksempler, bli funnet på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found