Checker Framework - sustavi tipova priključaka za Javu

1. Pregled

Od Java 8 izdanje nadalje, moguće je kompajlirati programe pomoću tzv Priključni sustavi - koji mogu primijeniti strože provjere od onih koje primjenjuje kompajler.

Trebamo se poslužiti samo napomenama koje nudi nekoliko Priključni sustavi dostupno.

U ovom ćemo kratkom članku istražiti Checker Framework, ljubaznošću Sveučilišta Washington.

2. Maven

Da bismo započeli rad s Checker Frameworkom, prvo ga moramo dodati u naš pom.xml:

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

Najnoviju verziju knjižnica možete provjeriti na Maven Central.

Prve dvije ovisnosti sadrže kôd Okvir za provjeru dok je potonja prilagođena verzija Java 8 klase, u kojima su programeri Windows pravilno označili sve vrste Okvir za provjeru.

Zatim moramo pravilno podesiti maven-compiler-plugin koristiti Okvir za provjeru kao utikač Tip sustava:

 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.FormattackCrécker.FormatprintChecker. -Upozori 

Ovdje je glavna stvar sadržaj označiti. Ovdje smo naveli sve dame koje želimo pokrenuti protiv svojih izvora.

3. Izbjegavanje NullPointerExceptions

Prvi scenarij u kojem Okvir za provjeru može nam pomoći identificiranje dijela kodova gdje a NullPoinerException može nastati:

privatni statički int countArgs (@NonNull String [] args) {return args.length; } javna statička void glavna (@Nullable String [] args) {System.out.println (countArgs (args)); }

U gornjem primjeru deklarirali smo s @NonNull napomena da je argumenata argument od countArgs () ne smije biti null.

Bez obzira na ovo ograničenje, u glavni(), pozivamo se na metodu prosljeđujući argument koji zaista može biti null, jer je označen s @Nullable.

Kada kompajliramo kod, Okvir za provjeru uredno nas upozorava da nešto u našem kodu može biti pogrešno:

[UPOZORENJE] /checker-plugin/.../NonNullExample.java: [12,38] [argument.type.incompatible] nekompatibilne vrste u argumentu. pronađeno: null nužno: @Initialized @NonNull String @Initialized @NonNull []

4. Pravilna upotreba konstanti kao nabrajanja

Ponekad koristimo niz konstanti jer su to bile stavke nabrajanja.

Pretpostavimo da nam treba niz zemalja i planeta. Zatim te stavke možemo označiti znakom @Fenum napomena za grupiranje svih konstanti koje su dio istog "lažnog" nabrajanja:

statički konačni @Fenum ("country") Niz ITALIJA = "IT"; statički konačni @Fenum ("country") Niz US = "US"; statički konačni @Fenum ("country") String UNITED_KINGDOM = "UK"; statički konačni @Fenum ("planet") Niz MARS = "Mars"; statički konačni @Fenum ("planet") Niz ZEMLJA = "Zemlja"; statički konačni @Fenum ("planet") Niz VENERA = "Venera";

Nakon toga, kada napišemo metodu koja bi trebala prihvatiti niz koji je "planet", možemo ispravno označiti argument:

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

Pogreškom se možemo pozvati greetPlanet () sa nizom koji nije definiran kao moguća vrijednost za planet, kao što je:

javna statička void glavna (String [] args) {obj.greetPlanets (US); }

Okvir za provjeru može uočiti pogrešku:

[UPOZORENJE] /checker-plugin/.../FakeNumExample.java:[29,26] [argument.type.incompatible] nekompatibilne vrste u argumentu. pronađeno: @Fenum ("country") Potreban je niz: @Fenum ("planet") String

5. Regularni izrazi

Pretpostavimo da znamo a Niz varijabla mora pohraniti regularni izraz s barem jednom odgovarajućom grupom.

Možemo iskoristiti Checker Framework i deklarirajte takvu varijablu tako:

@Regex (1) privatni statički niz FIND_NUMBERS = "\ d *";

To je očito potencijalna pogreška jer je regularni izraz kojem smo dodijelili FIND_NUMBERS nema nijednu podudarnu grupu.

Doista, Checker Framework marljivo će nas obavijestiti o našoj pogrešci tijekom sastavljanja:

[UPOZORENJE] /checker-plugin/.../RegexExample.java:[7,51] [assignment.type.incompatible] nekompatibilni tipovi u dodjeli. pronađeno: @Regex Niz je potreban: @Regex (1) Niz

6. Zaključak

Okvir za provjeru je koristan alat za programere koji žele nadići standardni kompajler i poboljšati ispravnost svog koda.

U stanju je otkriti, u vrijeme sastavljanja, nekoliko tipičnih pogrešaka koje se obično mogu otkriti samo tijekom izvođenja ili čak zaustaviti kompilaciju podizanjem pogreške pri kompiliranju.

Postoji mnogo više standardnih provjera od onoga što smo pokrili u ovom članku; provjerite čekove dostupne u Okvir za provjeru službeni priručnik ovdje, ili čak napišite svoj.

Kao i uvijek, izvorni kod za ovaj vodič, s još nekoliko primjera, može se naći na GitHubu.


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