En introduktion til Apache Commons Lang 3

1. Oversigt

Apache Commons Lang 3-biblioteket er en populær, komplet pakke med hjælpeklasser, der sigter mod at udvide funktionaliteten i Java API.

Bibliotekets repertoire er ret rigt og spænder fra streng-, array- og talmanipulation, refleksion og samtidighed til implementering af flere ordnede datastrukturer, som par og tredobler (generelt kendt som tuples).

I denne vejledning vi tager et dybt dyk på bibliotekets mest nyttige hjælpeklasser.

2. Maven-afhængigheden

Som sædvanligt skal vi først tilføje Maven-afhængighed for at komme i gang med Apache Commons Lang 3:

 org.apache.commons commons-lang3 3.8 

3. Den StringUtils Klasse

Den første nytteklasse, som vi dækker i denne indledende sammenfatning, er StringUtils.

Som navnet antyder, StringUtils giver os mulighed for at udføre en masse nul-sikre stringer operationer, der supplerer / udvider dem, der java.lang.Streng giver ud af kassen.

Lad os begynde at fremvise det sæt værktøjsmetoder, der udfører flere kontroller på en given snor, såsom at afgøre, om snor er tom, tom, med små bogstaver, med store bogstaver, alfanumeriske og så videre:

@Test offentlig ugyldig nårCalledisBlank_thenCorrect () {assertThat (StringUtils.isBlank ("")). IsTrue (); } @Test offentlig ugyldigt nårCalledisEmpty_thenCorrect () {assertThat (StringUtils.isEmpty ("")). IsTrue (); } @Test offentlig ugyldig nårCalledisAllLowerCase_thenCorrect () {assertThat (StringUtils.isAllLowerCase ("abd")). IsTrue (); } @Test offentlig ugyldig nårCalledisAllUpperCase_thenCorrect () {assertThat (StringUtils.isAllUpperCase ("ABC")). IsTrue (); } @Test offentlig ugyldigt nårCalledisMixedCase_thenCorrect () {assertThat (StringUtils.isMixedCase ("abC")). IsTrue (); } @Test offentlig ugyldig nårCalledisAlpha_thenCorrect () {assertThat (StringUtils.isAlpha ("abc")). IsTrue (); } @Test offentlig ugyldig nårCalledisAlphanumeric_thenCorrect () {assertThat (StringUtils.isAlphanumeric ("abc123")). IsTrue (); } 

Selvfølgelig er det StringUtils klasse implementerer mange andre metoder, som vi har udeladt her for enkelhedens skyld.

For nogle andre yderligere metoder, der kontrollerer eller anvender en eller anden form for konverteringsalgoritme til en given snor, tjek denne vejledning.

Dem, vi har dækket ovenfor, er virkelig ligetil, så enhedstestene skal være selvforklarende.

4. Den ArrayUtils Klasse

Det ArrayUtils klasse implementerer en række hjælpemetoder, der giver os mulighed for at behandle og kontrollere arrays i mange forskellige former og former.

Lad os starte med de to overbelastede implementeringer af toString () metode, som returnerer en snor repræsentation af det givne array og en specifik snor når array er nul:

@Test offentlig ugyldig nårCalledtoString_thenCorrect () {String [] array = {"a", "b", "c"}; assertThat (ArrayUtils.toString (array)) .isEqualTo ("{a, b, c}"); } @Test offentlig ugyldig nårCalledtoStringIfArrayisNull_thenCorrect () {assertThat (ArrayUtils.toString (null, "Array is null")) .isEqualTo ("Array is null"); } 

Dernæst har vi hasCode () og at kortlægge() metoder.

Førstnævnte genererer en brugerdefineret hashCode-implementering til en matrix, mens sidstnævnte konverterer en array til en Kort:

@Test offentlig ugyldig nårCalledhashCode_thenCorrect () {String [] array = {"a", "b", "c"}; assertThat (ArrayUtils.hashCode (array)) .isEqualTo (997619); } @Test offentlig ugyldig nårCalledtoMap_thenCorrect () {String [] [] array = {{"1", "one",}, {"2", "two",}, {"3", "three"}}; Kortkort = nyt HashMap (); map.put ("1", "one"); map.put ("2", "to"); map.put ("3", "tre"); assertThat (ArrayUtils.toMap (array)) .isEqualTo (map); }

Endelig, lad os se på isSameLength () og indeks af() metoder.

Førstnævnte bruges til at kontrollere, om to arrays har samme længde, og sidstnævnte til at få indekset for et givet element:

@Test offentlig ugyldig nårCalledisSameLength_thenCorrect () {int [] array1 = {1, 2, 3}; int [] array2 = {1, 2, 3}; assertThat (ArrayUtils.isSameLength (array1, array2)) .isTrue (); } @Test offentlig ugyldig nårCalledIndexOf_thenCorrect () {int [] array = {1, 2, 3}; assertThat (ArrayUtils.indexOf (array, 1, 0)) .isEqualTo (0); } 

Som med StringUtils klasse, ArrayUtils implementere meget mere af yderligere metoder. Du kan lære mere om dem i denne vejledning.

I dette tilfælde har vi kun vist de mest repræsentative.

5. Den NumberUtils Klasse

En anden nøglekomponent i Apache Commons Lang 3 er NumberUtils-klassen.

Som forventet, klassen giver et omfattende antal hjælpemetoder, der er rettet mod behandling og manipulation af numeriske typer.

Lad os se på de overbelastede implementeringer af sammenligne() metode, der sammenligner lighed mellem forskellige primitiver, såsom int og lang:

@Test offentlig ugyldig nårCalledcompareWithIntegers_thenCorrect () {assertThat (NumberUtils.compare (1, 1)) .isEqualTo (0); } @Test offentlig ugyldig nårCalledcompareWithLongs_thenCorrect () {assertThat (NumberUtils.compare (1L, 1L)) .isEqualTo (0); }

Derudover findes der implementeringer af sammenligne() der fungerer byte og kort, som fungerer meget lig ovenstående eksempler.

Næste i denne anmeldelse er createNumber () og isDigit () metoder.

Den første giver os mulighed for at oprette en numerisk repræsentation af en snor, mens det andet kontrollerer, om en snor består kun af cifre:

@Test offentlig ugyldig nårCalledcreateNumber_thenCorrect () {assertThat (NumberUtils.createNumber ("123456")) .isEqualTo (123456); } @Test offentlig ugyldig nårCalledisDigits_thenCorrect () {assertThat (NumberUtils.isDigits ("123456")). IsTrue (); } 

Når det kommer til at finde blandings- og maksimumsværdierne for et leveret array, vises NumberUtils klasse yder stærk støtte til disse operationer gennem overbelastede implementeringer af min () og maks () metoder:

@Test offentlig ugyldig nårCalledmaxwithIntegerArray_thenCorrect () {int [] array = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.max (array)) .isEqualTo (6); } @Test offentlig ugyldig nårCalledminwithIntegerArray_thenCorrect () {int [] array = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.min (array)). er EqualTo (1); } @Test offentlig ugyldig nårCalledminwithByteArray_thenCorrect () {byte [] array = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.min (array)) .isEqualTo ((byte) 1); }

6. Det Brøk Klasse

Det er fint og godt at arbejde med fraktioner, når vi bruger en pen og et stykke papir. Men skal vi gennemgå kompleksiteten i denne proces, når vi skriver kode? Ikke rigtig.

Det Brøk klasse gør det at tilføje, trække og multiplicere brøker i en leg:

@Test offentlig ugyldig nårCalledgetFraction_thenCorrect () {assertThat (Fraction.getFraction (5, 6)). IsInstanceOf (Fraction.class); } @Test offentlig ugyldighed givenTwoFractionInstances_whenCalledadd_thenCorrect () {Brøkdel fraktion1 = Fraktion.getFraktion (1, 4); Brøkdel fraktion2 = Fraktion.getFraktion (3, 4); assertThat (fraction1.add (fraction2) .toString ()). er EqualTo ("1/1"); } @Test offentlig ugyldighed givenTwoFractionInstances_whenCalledsubstract_thenCorrect () {Brøkdel fraktion1 = Fraktion.getFraktion (3, 4); Brøkdel fraktion2 = Fraktion.getFraktion (1, 4); assertThat (fraction1.subtract (fraction2) .toString ()). er EqualTo ("1/2"); } @Test offentlig ugyldighed givenTwoFractionInstances_whenCalledmultiply_thenCorrect () {Brøkdel fraktion1 = Fraktion.getFraktion (3, 4); Brøkdel fraktion2 = Fraktion.getFraktion (1, 4); assertThat (fraction1.multiplyBy (fraction2) .toString ()). er EqualTo ("3/16"); }

Mens operationer med brøker ikke helt sikkert er den hyppigste opgave, som vi bliver nødt til at tackle i vores daglige udviklingsarbejde, er Brøk klasse giver værdifuld støtte til at udføre disse operationer på en ligetil måde.

7. Den SystemUtils Klasse

Nogle gange er vi nødt til at få nogle dynamiske oplysninger om forskellige egenskaber og variabler for den underliggende Java-platform eller operativsystemet.

Apache Commons Lang 3 leverer SystemUtils klasse for at opnå dette på en smertefri måde.

Lad os f.eks. Overveje getJavaHome (), getUserHome () og isJavaVersionAtLeast () metoder:

@Test offentlig ugyldig nårCalledgetJavaHome_thenCorrect () {assertThat (SystemUtils.getJavaHome ()) .isEqualTo (ny fil ("sti / til / java / jdk")); } @Test offentlig ugyldig nårCalledgetUserHome_thenCorrect () {assertThat (SystemUtils.getUserHome ()) .isEqualTo (ny fil ("sti / til / bruger / hjem")); } @Test offentlig ugyldig nårCalledisJavaVersionAtLeast_thenCorrect () {assertThat (SystemUtils.isJavaVersionAtLeast (JavaVersion.JAVA_RECENT)). IsTrue (); }

Der er et par ekstra hjælpemetoder, som SystemUtils klasse redskaber. Vi har udeladt dem for at holde eksemplerne korte.

8. Lazy initialisering og Builder-klasser

En af Apache Commons Lang 3s mest tiltalende facet er implementeringen af ​​nogle kendte designmønstre, herunder doven initialisering og builder mønstre.

Lad os for eksempel sige, at vi har skabt en dyr Bruger klasse (ikke vist for kortfattethed) og ønsker at udsætte dets instantiering, indtil det virkelig er nødvendigt.

I et sådant tilfælde er alt, hvad vi skal gøre, at udvide den parametriserede abstrakte klasse for LazyInitializer og tilsidesætte dens initialisere () metode:

offentlig klasse UserInitializer udvider LazyInitializer {@ Override-beskyttet bruger initialiserer () {returner ny bruger ("John", "[e-mailbeskyttet]"); }}

Nu, hvis vi vil blive dyre Bruger når det kræves, kalder vi bare på UserInitializer får () metode:

@Test offentlig ugyldig nårCalledget_thenCorrect () kaster ConcurrentException {UserInitializer userInitializer = ny UserInitializer (); assertThat (userInitializer.get ()). erInstanceOf (User.class); }

Det få() metode er en implementering af dobbeltkontrol idiom (trådsikker) for et instansfelt som specificeret i Joshua Blochs "Effektive Java", punkt 71:

privat flygtig brugerinstans; Bruger får () {if (forekomst == null) {synkroniseret (dette) {hvis (forekomst == null) forekomst = ny bruger ("John", "[e-mailbeskyttet]"); }}} returner instans; }

Derudover implementerer Apache Commons Lang 3 HashCodeBuilder-klassen, som giver os mulighed for at generere hashCode () implementeringer ved at forsyne bygherren med forskellige parametre, baseret på en typisk flydende API:

@Test offentligt ugyldigt, nårCalledtoHashCode_thenCorrect () {int hashcode = new HashCodeBuilder (17, 37) .append ("John") .append ("[email protected]") .toHashCode (); assertThat (hashcode) .isEqualTo (1269178828); }

Vi kan gøre noget lignende med BasicThreadFactory klasse, og opret dæmontråde med et navngivningsmønster og en prioritet:

@Test offentlig ugyldig nårCalledBuilder_thenCorrect () {BasicThreadFactory fabrik = ny BasicThreadFactory.Builder () .namingPattern ("arbejdstøj-% d") .daemon (sand) .priority (Thread.MAX_PRIORITY) .build (); assertThat (fabrik) .isInstanceOf (BasicThreadFactory.class); }

9. Den ConstructorUtils Klasse

Reflection er en førsteklasses borger i Apache Commons Lang 3.

Biblioteket indeholder flere refleksionsklasser, som giver os mulighed for reflekterende at få adgang til og manipulere klassefelter og metoder.

Lad os for eksempel sige, at vi har implementeret en naiv Bruger domæne klasse:

offentlig klasse bruger {privat strengnavn; privat streng e-mail; // standardkonstruktører / getters / setters / toString}

Antages det, at dens parametriserede konstruktør er offentlig, vi har let adgang til det med ConstructorUtils klasse:

@Test offentlig ugyldig nårCalledgetAccessibleConstructor_thenCorrect () {assertThat (ConstructorUtils .getAccessibleConstructor (User.class, String.class, String.class)) .isInstanceOf (Constructor.class); } 

Alternativt til standardklasse instantiering via konstruktører, kan vi reflekterende oprette Bruger tilfælde ved bare at ringe til påkaldeConstructor () og påkaldeExactConstructor () metoder:

@Test offentlig ugyldig når CalledinvokeConstructor_thenCorrect () kaster undtagelse {assertThat (ConstructorUtils.invokeConstructor (User.class, "name", "email")) .isInstanceOf (User.class); } @Test offentlig ugyldigt nårCalledinvokeExactConstructor_thenCorrect () kaster undtagelse {String [] args = {"name", "email"}; Klasse [] parameterTypes = {String.class, String.class}; assertThat (ConstructorUtils.invokeExactConstructor (User.class, args, parameterTypes)) .isInstanceOf (User.class); } 

10. Den FieldUtils Klasse

Tilsvarende vi kan bruge metoderne til FieldUtils klasse til reflekterende læsning / skrivning af feltfelter.

Lad os antage, at vi ønsker at få et felt af Bruger klasse eller til sidst et felt, som klassen arver fra en superklasse.

I et sådant tilfælde kan vi påberåbe os getField () metode:

@Test offentlig ugyldig nårCalledgetField_thenCorrect () {assertThat (FieldUtils.getField (User.class, "name", true) .getName ()) .isEqualTo ("name"); } 

Alternativt hvis vi ønsker at bruge et mere restriktivt refleksionsomfang og kun få et felt deklareret i Bruger klasse og ikke arvet fra en superklasse, vi bruger bare getDeclaredField () metode:

@Test offentlig ugyldig nårCalledgetDeclaredFieldForceAccess_thenCorrect () {assertThat (FieldUtils.getDeclaredField (User.class, "name", true) .getName ()) .isEqualTo ("name"); }

Derudover kan vi bruge getAllFields () metode til at få antallet af felter i den reflekterede klasse og skrive en værdi til et deklareret felt eller et felt defineret i et hierarki med skrivFelt () og writeDeclaredField () metoder:

@Test offentlig ugyldig nårCalledgetAllFields_thenCorrect () {assertThat (FieldUtils.getAllFields (User.class) .length) .isEqualTo (2); } @ Test offentligt ugyldigt når CalledwriteField_thenCorrect () kaster IllegalAccessException {FieldUtils.writeField (bruger, "navn", "Julie", sandt); assertThat (FieldUtils.readField (bruger, "navn", sandt)) .isEqualTo ("Julie"); } @Test offentlig ugyldighed givenFieldUtilsClass_whenCalledwriteDeclaredField_thenCorrect () kaster IllegalAccessException {FieldUtils.writeDeclaredField (bruger, "navn", "Julie", sandt); assertThat (FieldUtils.readField (bruger, "navn", sandt)) .isEqualTo ("Julie"); }

11. Den MetodeUtils Klasse

På samme måde kan vi bruge refleksion over klassemetoder med MetodeUtils klasse.

I dette tilfælde er synligheden af Bruger klasse ' getName () metode er offentlig. Så vi kan få adgang til det med getAccessibleMethod () metode:

@Test offentlig ugyldig nårCalledgetAccessibleMethod_thenCorrect () {assertThat (MethodUtils.getAccessibleMethod (User.class, "getName")) .isInstanceOf (Method.class); } 

Når det kommer til reflekterende påkaldte metoder, kan vi bruge påkaldeExactMethod () og påkaldeMethod () metoder:

@Test offentlig ugyldig nårCalledinvokeExactMethod_thenCorrect () kaster undtagelse {assertThat (MethodUtils.invokeExactMethod (ny bruger ("John", "[email protected]"), "getName")) .isEqualTo ("John"); } @Test offentlig ugyldig når CalledinvokeMethod_thenCorrect () kaster undtagelse {Brugerbruger = ny bruger ("John", "[e-mailbeskyttet]"); Objektmetode = MethodUtils.invokeMethod (bruger, sandt, "setName", "John"); assertThat (user.getName ()). isEqualTo ("John"); }

12. Den MutableObject Klasse

Mens uforanderlighed er et nøglefunktion i god objektorienteret software, som vi i alle mulige tilfælde bør have som standarddesværre er vi nogle gange nødt til at håndtere foranderlige objekter.

Desuden kræver oprettelse af mutable klasser en masse kedelpladekode, som kan genereres af de fleste IDE'er via automatisk genererede settere.

Til dette formål leverer Apache Commons Lang 3 MutableObject klasse, en simpel indpakningsklasse til oprettelse af ændrede objekter med minimalt besvær:

@BeforeClass offentlig statisk ugyldighed setUpMutableObject () {mutableObject = new MutableObject ("Initial value"); } @Test offentlig ugyldig nårCalledgetValue_thenCorrect () {assertThat (mutableObject.getValue ()). IsInstanceOf (String.class); } @Test offentlig ugyldig når CallSetValue_thenCorrect () {mutableObject.setValue ("En anden værdi"); assertThat (mutableObject.getValue ()). isEqualTo ("En anden værdi"); } @Test offentlig ugyldig nårCalledtoString_thenCorrect () {assertThat (mutableObject.toString ()). IsEqualTo ("Another value"); } 

Selvfølgelig er dette kun et eksempel på, hvordan man bruger MutableObject klasse.

Som tommelfingerregel vi bør altid stræbe efter at skabe uforanderlige klasser eller i værste fald kun give det krævede niveau af mutabilitet.

13. Den MutablePair Klasse

Interessant nok giver Apache Commons Lang 3 stærk støtte til tupler i form af par og tredobler.

Så lad os antage, at vi har brug for at oprette et ændret par af ordnede elementer.

I et sådant tilfælde bruger vi MutablePair klasse:

privat statisk MutablePair mutablePair; @BeforeClass offentlig statisk ugyldighed setUpMutablePairInstance () {mutablePair = new MutablePair ("leftElement", "rightElement"); } @Test offentlig ugyldig nårCalledgetLeft_thenCorrect () {assertThat (mutablePair.getLeft ()). IsEqualTo ("leftElement"); } @Test offentlig ugyldig nårCalledgetRight_thenCorrect () {assertThat (mutablePair.getRight ()). IsEqualTo ("rightElement"); } @Test offentlig ugyldig nårCalledsetLeft_thenCorrect () {mutablePair.setLeft ("newLeftElement"); assertThat (mutablePair.getLeft ()). isEqualTo ("newLeftElement"); } 

Den mest relevante detalje, der er værd at understrege her, er klassens rene API.

Det giver os mulighed for at indstille og få adgang til de venstre og højre objekter, der er pakket af parret gennem standard sætterne / getterne.

14. Den Uforanderligt par Klasse

Ikke overraskende er der også en uforanderlig modstykkeimplementering af MutablePair klasse, kaldet Uforanderligt par:

privat statisk ImmutablePair immutablePair = ny ImmutablePair ("leftElement", "rightElement"); @Test offentlig ugyldig nårCalledgetLeft_thenCorrect () {assertThat (immutablePair.getLeft ()). IsEqualTo ("leftElement"); } @Test offentlig ugyldig nårCalledgetRight_thenCorrect () {assertThat (immutablePair.getRight ()). IsEqualTo ("rightElement"); } @Test offentlig ugyldig nårCalledof_thenCorrect () {assertThat (ImmutablePair.of ("leftElement", "rightElement")) .isInstanceOf (ImmutablePair.class); } @Test (forventet = UnsupportedOperationException.class) offentlig ugyldig nårCalledSetValue_thenThrowUnsupportedOperationException () {immutablePair.setValue ("newValue"); } 

Som vi kunne forvente af en uforanderlig klasse, ethvert forsøg på at ændre parrets interne tilstand gennem setValue () metoden vil resultere i at kaste en Ikke-understøttetOperationException undtagelse.

15. Det Tredobbelt Klasse

Den sidste nytteklasse, der vil se på her, er Tredobbelt.

Da klassen er abstrakt, kan vi skabe Tredobbelt tilfælde ved hjælp af af() statisk fabriksmetode:

@BeforeClass offentlig statisk ugyldighed setUpTripleInstance () {triple = Triple.of ("leftElement", "middleElement", "rightElement"); } @Test offentlig ugyldig nårCalledgetLeft_thenCorrect () {assertThat (triple.getLeft ()). IsEqualTo ("leftElement"); } @Test offentlig ugyldig nårCalledgetMiddle_thenCorrect () {assertThat (triple.getMiddle ()). IsEqualTo ("middleElement"); } @Test offentlig ugyldig nårCalledgetRight_thenCorrect () {assertThat (triple.getRight ()). IsEqualTo ("rightElement"); }

Der er også konkrete implementeringer for både foranderlige og uforanderlige tredobler gennem MutableTriple og UforanderligTriple klasser.

Vi kan oprette deres forekomster via parametriserede konstruktører snarere end med en statisk fabriksmetode.

I dette tilfælde springer vi bare over dem, da deres API'er ligner dem MutablePair og Uforanderligt par klasser.

16. Konklusion

I denne vejledning tog vi et dybtgående kig på nogle af de mest nyttige hjælpeklasser, som Apache Commons Lang 3 giver af hylden .

Biblioteket implementerer mange andre hjælpeklasser, der er værd at se på. Her har vi lige vist de mest nyttige, baseret på et smukt meningsfuldt kriterium.

For den fulde biblioteks-API, se venligst de officielle Javadocs.

Som normalt er alle kodeeksempler vist i denne vejledning tilgængelige på GitHub.


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