Uvod u Apache Commons Lang 3

1. Pregled

Biblioteka Apache Commons Lang 3 je popularan, cjeloviti paket klasa uslužnih programa, čiji je cilj proširiti funkcionalnost Java API-ja.

Repertoar knjižnice prilično je bogat, od manipulacije nizovima, nizovima i brojevima, refleksije i istodobnosti, do implementacija nekoliko uređenih struktura podataka, poput parova i trojki (generički poznatih kao korijeni).

U ovom vodiču, duboko ćemo zaroniti u najkorisnije satove knjižnice u knjižnici.

2. Ovisnost Mavena

Kao i obično, da bismo započeli koristiti Apache Commons Lang 3, prvo moramo dodati ovisnost Mavena:

 org.apache.commons commons-lang3 3.8 

3. The StringUtils Razred

Prva klasa korisnosti koju ćemo obrađivati ​​u ovom uvodnom pregledu je StringUtils.

Kao što mu samo ime govori, StringUtils omogućuje nam izvođenje hrpe null-safe strings operacije koje nadopunjuju / proširuju one koje java.lang.String pruža iz kutije.

Počnimo prikazivati ​​skup korisnih metoda koje vrše nekoliko provjera na danom niz, kao što je utvrđivanje je li niz je prazno, prazno, malo, veliko, veliko, alfanumeričko i tako dalje:

@Test javna void whenCalledisBlank_thenCorrect () {assertThat (StringUtils.isBlank ("")). IsTrue (); } @Test javna void kadaCalledisEmpty_thenCorrect () {assertThat (StringUtils.isEmpty ("")). IsTrue (); } @Test javna praznina kada jeCalledisAllLowerCase_thenCorrect () {assertThat (StringUtils.isAllLowerCase ("abd")). IsTee (); } @Test javna void kadaCalledisAllUpperCase_thenCorrect () {assertThat (StringUtils.isAllUpperCase ("ABC")). IsTrue (); } @Test javna void kadaCalledisMixedCase_thenCorrect () {assertThat (StringUtils.isMixedCase ("abC")). IsTrue (); } @Test javna praznina kada jeCalledisAlpha_thenCorrect () {assertThat (StringUtils.isAlpha ("abc")). IsTrue (); } @Test public void whenCalledisAlphanumeric_thenCorrect () {assertThat (StringUtils.isAlphanumeric ("abc123")). IsTrue (); } 

Naravno, StringUtils klasa implementira mnoge druge metode, koje smo ovdje zbog jednostavnosti izostavili.

Za neke druge dodatne metode kojima se provjerava ili primjenjuje neka vrsta algoritma pretvorbe na zadani niz, provjerite ovaj vodič.

Oni koji smo gore pokrili zaista su jasni, pa bi jedinični testovi trebali biti samorazumljivi.

4. The ArrayUtils Razred

The ArrayUtils klasa implementira skup korisnih metoda koje nam omogućuju obradu i provjeru nizova u mnogo različitih oblika i oblika.

Počnimo s dvije preopterećene implementacije toString () metoda koja vraća a niz predstavljanje datog niz i specifična niz kada niz je null:

@Test public void whenCalledtoString_thenCorrect () {String [] array = {"a", "b", "c"}; assertThat (ArrayUtils.toString (niz)) .isEqualTo ("{a, b, c}"); } @Test public void whenCalledtoStringIfArrayisNull_thenCorrect () {assertThat (ArrayUtils.toString (null, "Array is null")) .isEqualTo ("Array is null"); } 

Dalje, imamo hasCode () i toMap () metode.

Prvi generira prilagođenu implementaciju hashCodea za niz, dok potonji pretvara an niz do a Karta:

@Test public void whenCalledhashCode_thenCorrect () {String [] array = {"a", "b", "c"}; assertThat (ArrayUtils.hashCode (niz)) .isEqualTo (997619); } @Test public void whenCalledtoMap_thenCorrect () {String [] [] array = {{"1", "one",}, {"2", "two",}, {"3", "three"}}; Karta karte = novi HashMap (); map.put ("1", "jedan"); map.put ("2", "dva"); map.put ("3", "tri"); assertThat (ArrayUtils.toMap (niz)) .isEqualTo (karta); }

Na kraju, pogledajmo isSameLength () i indexOf () metode.

Prvi se koristi za provjeru imaju li dva polja istu dužinu, a drugi za dobivanje indeksa datog elementa:

@Test javna void whenCalledisSameLength_thenCorrect () {int [] array1 = {1, 2, 3}; int [] niz2 = {1, 2, 3}; assertThat (ArrayUtils.isSameLength (niz1, niz2)) .isTrue (); } @Test public void whenCalledIndexOf_thenCorrect () {int [] niz = {1, 2, 3}; assertThat (ArrayUtils.indexOf (niz, 1, 0)) .isEqualTo (0); } 

Kao i kod StringUtils razred, ArrayUtils implementirati puno više dodatnih metoda. O njima možete saznati više u ovom vodiču.

U ovom smo slučaju prikazali samo one najreprezentativnije.

5. The NumberUtils Razred

Sljedeća ključna komponenta Apache Commons Lang 3 je klasa NumberUtils.

Očekivano, klasa nudi velik broj korisnih metoda, usmjerenih na obradu i manipulaciju numeričkim vrstama.

Pogledajmo preopterećene implementacije usporedi () metoda koja uspoređuje jednakost različitih primitiva, kao što su int i dugo:

@Test public void whenCalledcompareWithIntegers_thenCorrect () {assertThat (NumberUtils.compare (1, 1)) .isEqualTo (0); } @Test public void whenCalledcompareWithLongs_thenCorrect () {assertThat (NumberUtils.compare (1L, 1L)) .isEqualTo (0); }

Pored toga, postoje implementacije usporedi () koji operiraju bajt i kratak, koji djeluju vrlo slično gornjim primjerima.

Sljedeći u ovom pregledu su createNumber () i isDigit () metode.

Prvi nam omogućuje stvaranje numeričkog prikaza a niz, dok drugi provjerava je li a niz sastoji se samo od znamenki:

@Test public void whenCalledcreateNumber_thenCorrect () {assertThat (NumberUtils.createNumber ("123456")) .isEqualTo (123456); } @Test javna void whenCalledisDigits_thenCorrect () {assertThat (NumberUtils.isDigits ("123456")). IsTrue (); } 

Kada je riječ o pronalaženju miksa i maksimalnih vrijednosti isporučenog polja, NumberUtils klasa pruža snažnu podršku ovim operacijama kroz preopterećene implementacije min () i maks. () metode:

@Test javna praznina whenCalledmaxwithIntegerArray_thenCorrect () {int [] niz = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.max (niz)) .isEqualTo (6); } @Test public void whenCalledminwithIntegerArray_thenCorrect () {int [] array = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.min (niz)). isEqualTo (1); } @Test public void whenCalledminwithByteArray_thenCorrect () {byte [] array = {1, 2, 3, 4, 5, 6}; assertThat (NumberUtils.min (niz)) .isEqualTo ((bajt) 1); }

6. The Frakcija Razred

Rad s razlomcima je u redu i dobro kada koristimo olovku i papir. Ali, moramo li proći kroz složenost ovog procesa prilikom pisanja koda? Ne baš.

The Frakcija razred donosi zbrajanje, oduzimanje i množenje razlomka na vjetru:

@Test public void whenCalledgetFraction_thenCorrect () {assertThat (Fraction.getFraction (5, 6)). IsInstanceOf (Fraction.class); } @Test javna praznina givenTwoFractionInsests_whenCalledadd_thenCorrect () {Fraction fraction1 = Fraction.getFraction (1, 4); Fraction fraction2 = Fraction.getFraction (3, 4); assertThat (fraction1.add (fraction2) .toString ()). isEqualTo ("1/1"); } @Test javna praznina givenTwoFractionInsests_whenCalledsubstract_thenCorrect () {Fraction fraction1 = Fraction.getFraction (3, 4); Fraction fraction2 = Fraction.getFraction (1, 4); assertThat (fraction1.subtract (fraction2) .toString ()). isEqualTo ("1/2"); } @Test javna praznina givenTwoFractionInsests_whenCalledmultiply_thenCorrect () {Fraction fraction1 = Fraction.getFraction (3, 4); Fraction fraction2 = Fraction.getFraction (1, 4); assertThat (fraction1.multiplyBy (fraction2) .toString ()). isEqualTo ("3/16"); }

Iako operacije s razlomcima nisu zasigurno najčešći zadatak s kojim ćemo se morati nositi u svakodnevnom razvojnom radu, Frakcija klasa pruža dragocjenu podršku za izvođenje ovih operacija na neposredan način.

7. The SystemUtils Razred

Ponekad moramo dobiti neke dinamičke informacije o različitim svojstvima i varijablama osnovne platforme Java ili operativnog sustava.

Apache Commons Lang 3 nudi Klasa SystemUtils za postizanje ovoga na bezbolan način.

Razmotrimo, na primjer, getJavaHome (), getUserHome () i isJavaVersionAtLeast () metode:

@Test public void whenCalledgetJavaHome_thenCorrect () {assertThat (SystemUtils.getJavaHome ()) .isEqualTo (nova datoteka ("put / do / java / jdk")); } @Test public void whenCalledgetUserHome_thenCorrect () {assertThat (SystemUtils.getUserHome ()) .isEqualTo (nova datoteka ("put / do / korisnika / kuće")); } @Test public void whenCalledisJavaVersionAtLeast_thenCorrect () {assertThat (SystemUtils.isJavaVersionAtLeast (JavaVersion.JAVA_RECENT)). IsTrue (); }

Postoji nekoliko dodatnih korisnih metoda koje SystemUtils razredna oprema. Izostavili smo ih kako bi primjeri bili kratki.

8. Razredi lijene inicijalizacije i graditelji

Jedan od najprivlačnijih aspekata Apache Commons Lang 3 je provedba nekih poznatih obrazaca dizajna, uključujući uzorke lijene inicijalizacije i graditelja.

Na primjer, recimo da smo stvorili skupo Korisnik klase (ne prikazuje se zbog kratkoće) i želite odgoditi njezinu instancu dok to stvarno ne zatreba.

U takvom slučaju, sve što trebamo učiniti je proširiti parametariziranu apstraktnu klasu LazyInitializer i nadjačati njezinu inicijalizirati () metoda:

javna klasa UserInitializer proširuje LazyInitializer {@Override zaštićeni korisnik initialize () {return new User ("John", "[email protected]"); }}

Sad, ako želimo skupo doći Korisnik objekt kada je to potrebno, mi samo zovemo UserInitializer's get () metoda:

@Test public void whenCalledget_thenCorrect () baca ConcurrentException {UserInitializer userInitializer = new UserInitializer (); assertThat (userInitializer.get ()). isInstanceOf (User.class); }

The dobiti() metoda je implementacija idioma dvostruke provjere (zaštićen od niti) za polje instance, kako je navedeno u Joshua Bloch "Učinkovita Java", točka 71:

privatna nestabilna instanca korisnika; Korisnik get () {if (instance == null) {sinkronizirano (ovo) {if (instance == null) instance = new User ("John", "[email protected]"); }}} return instanca; }

Uz to, Apache Commons Lang 3 implementira klasu HashCodeBuilder, koja nam omogućuje generiranje hashCode () implementacije opskrbom graditelja različitim parametrima, na temelju tipičnog fluentnog API-ja:

@Test public void whenCalledtoHashCode_thenCorrect () {int hashcode = new HashCodeBuilder (17, 37) .append ("John") .append ("[email protected]" .toHashCode (); assertThat (hashcode) .isEqualTo (1269178828); }

Možemo učiniti nešto slično s BasicThreadFactory klase i stvorite demonske niti s uzorkom imenovanja i prioritetom:

@Test public void whenCalledBuilder_thenCorrect () {BasicThreadFactory factory = new BasicThreadFactory.Builder () .namingPattern ("workerthread-% d") .daemon (true) .priority (Thread.MAX_PRIORITY) .build (); assertThat (factory) .isInstanceOf (BasicThreadFactory.class); }

9. The ConstructorUtils Razred

Reflection je prvorazredni građanin Apache Commons Lang 3.

Knjižnica uključuje nekoliko klasa refleksije, što nam omogućuje refleksivni pristup poljima i metodama klase i manipulaciji njima.

Na primjer, recimo da smo primijenili naivnost Korisnik klasa domene:

korisnik javne klase {naziv privatnog niza; privatni String e-mail; // standardni konstruktori / getteri / setteri / toString}

Pod pretpostavkom da je njegov parametarski konstruktor javnost, možemo mu lako pristupiti s ConstructorUtils razred:

@Test public void whenCalledgetAccessibleConstructor_thenCorrect () {assertThat (ConstructorUtils .getAccessibleConstructor (User.class, String.class, String.class)) .isInstanceOf (Constructor.class); } 

Alternativno instanciranju standardne klase putem konstruktora, možemo reflektivno stvarati Korisnik instancama samo pozivanjem invokeConstructor () i invokeExactConstructor () metode:

@Test public void whenCalledinvokeConstructor_thenCorrect () baca iznimku {assertThat (ConstructorUtils.invokeConstructor (User.class, "name", "email")) .isInstanceOf (User.class); } @Test public void whenCalledinvokeExactConstructor_thenCorrect () baca iznimku {String [] args = {"name", "email"}; Klasa [] parameterTypes = {String.class, String.class}; assertThat (ConstructorUtils.invokeExactConstructor (User.class, args, parameterTypes)) .isInstanceOf (User.class); } 

10. The FieldUtils Razred

Slično tome, možemo se služiti metodama FieldUtils razred za reflektivno čitanje / pisanje polja predavanja.

Pretpostavimo da želimo dobiti polje Korisnik klase ili na kraju polje koje razred nasljeđuje od superklase.

U takvom slučaju možemo se pozvati na getField () metoda:

@Test public void whenCalledgetField_thenCorrect () {assertThat (FieldUtils.getField (User.class, "name", true) .getName ()) .isEqualTo ("name"); } 

Alternativno, ako želimo koristiti restriktivniji opseg refleksije i dobiti samo polje deklarirano u Korisnik razreda, a nije naslijeđeno od superklase, samo bismo koristili getDeclaredField () metoda:

@Test public void whenCalledgetDeclaredFieldForceAccess_thenCorrect () {assertThat (FieldUtils.getDeclaredField (User.class, "name", true) .getName ()) .isEqualTo ("name"); }

Osim toga, možemo koristiti getAllFields () metoda za dobivanje broja polja reflektirane klase i upišite vrijednost u deklarirano polje ili polje definirano u hijerarhiji s writeField () i writeDeclaredField () metode:

@Test public void whenCalledgetAllFields_thenCorrect () {assertThat (FieldUtils.getAllFields (User.class) .length) .isEqualTo (2); } @Test public void whenCalledwriteField_thenCorrect () baca IllegalAccessException {FieldUtils.writeField (user, "name", "Julie", true); assertThat (FieldUtils.readField (korisnik, "ime", istina)) .isEqualTo ("Julie"); } @Test javna praznina givenFieldUtilsClass_whenCalledwriteDeclaredField_thenCorrect () baca IllegalAccessException {FieldUtils.writeDeclaredField (user, "name", "Julie", true); assertThat (FieldUtils.readField (korisnik, "ime", istina)) .isEqualTo ("Julie"); }

11. The MethodUtils Razred

U skladu s istim, možemo upotrijebiti razmišljanje o metodama klase s MethodUtils razred.

U ovom slučaju, vidljivost Korisnik razred ' getName () metoda je javnost. Dakle, možemo mu pristupiti s getAccessibleMethod () metoda:

@Test public void whenCalledgetAccessibleMethod_thenCorrect () {assertThat (MethodUtils.getAccessibleMethod (User.class, "getName")) .isInstanceOf (Method.class); } 

Kada je riječ o reflektirajućim pozivima na metode, možemo koristiti invokeExactMethod () i invokeMethod () metode:

@Test public void whenCalledinvokeExactMethod_thenCorrect () baca iznimku {assertThat (MethodUtils.invokeExactMethod (new User ("John", "[email protected]", "getName"))) .isEqualTo ("John"); } @Test public void whenCalledinvokeMethod_thenCorrect () baca iznimku {User user = new User ("John", "[email protected]"); Object method = MethodUtils.invokeMethod (user, true, "setName", "John"); assertThat (user.getName ()). isEqualTo ("Ivan"); }

12. The PromjenjiviObjekt Razred

Iako je nepromjenjivost ključna značajka dobrog objektno-orijentiranog softvera za koji bismo trebali u svakom slučaju pristati, nažalost ponekad moramo imati posla s promjenjivim objektima.

Štoviše, stvaranje promjenjivih klasa zahtijeva puno standardnog koda, koji većina IDE-a može generirati putem automatski generiranih postavljača.

U tu svrhu, Apache Commons Lang 3 nudi PromjenjiviObjekt klasa, jednostavna klasa omota za stvaranje promjenjivih objekata s minimalnom mukom:

@BeforeClass javna statička praznina setUpMutableObject () {mutableObject = new MutableObject ("Početna vrijednost"); } @Test public void whenCalledgetValue_thenCorrect () {assertThat (mutableObject.getValue ()). IsInstanceOf (String.class); } @Test public void whenCalledsetValue_thenCorrect () {mutableObject.setValue ("Druga vrijednost"); assertThat (mutableObject.getValue ()). isEqualTo ("Druga vrijednost"); } @Test public void whenCalledtoString_thenCorrect () {assertThat (mutableObject.toString ()). IsEqualTo ("Druga vrijednost"); } 

Naravno, ovo je samo primjer kako koristiti PromjenjiviObjekt razred.

Kao pravilo palca, uvijek bismo trebali težiti stvaranju nepromjenjivih klasa ili u najgorem slučaju pružiti samo potrebnu razinu promjenljivosti.

13. The Promjenjivi par Razred

Zanimljivo je da Apache Commons Lang 3 pruža snažnu potporu tortovima, u obliku parova i trojki.

Dakle, pretpostavimo da trebamo stvoriti promjenjivi par uređenih elemenata.

U takvom bismo slučaju koristili Promjenjivi par razred:

privatni statički MutablePair mutablePair; @BeforeClass javna statička praznina setUpMutablePairInstance () {mutablePair = new MutablePair ("leftElement", "rightElement"); } @Test javna praznina kada jeCalledgetLeft_thenCorrect () {assertThat (mutablePair.getLeft ()). IsEqualTo ("leftElement"); } @Test public void whenCalledgetRight_thenCorrect () {assertThat (mutablePair.getRight ()). IsEqualTo ("rightElement"); } @Test public void whenCalledsetLeft_thenCorrect () {mutablePair.setLeft ("newLeftElement"); assertThat (mutablePair.getLeft ()). isEqualTo ("newLeftElement"); } 

Najvažniji detalj koji ovdje vrijedi naglasiti je čisti API klase.

Omogućuje nam postavljanje i pristup lijevim i desnim objektima umotanim u paru preko standardnih postavljača / getera.

14. The Nepromjenjivi par Razred

Nije iznenađujuće, postoji i nepromjenjiva provedba Promjenjivi par razred, nazvan Nepromjenjivi par:

private static ImmutablePair immutablePair = new ImmutablePair ("leftElement", "rightElement"); @Test public void whenCalledgetLeft_thenCorrect () {assertThat (immutablePair.getLeft ()). IsEqualTo ("leftElement"); } @Test public void whenCalledgetRight_thenCorrect () {assertThat (immutablePair.getRight ()). IsEqualTo ("rightElement"); } @Test public void whenCalledof_thenCorrect () {assertThat (ImmutablePair.of ("leftElement", "rightElement")) .isInstanceOf (ImmutablePair.class); } @Test (očekuje se = UnsupportedOperationException.class) javna praznina kada jeCalledSetValue_thenThrowUnsupportedOperationException () {immutablePair.setValue ("newValue"); } 

Kao što bismo mogli očekivati ​​od nepromjenjive klase, svaki pokušaj promjene unutarnjeg stanja para kroz setValue () metoda rezultirat će bacanjem UnsupportedOperationException iznimka.

15. The Utrostručiti Razred

Posljednja klasa korisnosti koju ćemo ovdje pogledati je Utrostručiti.

Kako je nastava apstraktna, možemo stvarati Utrostručiti instanci pomoću od() statička tvornička metoda:

@BeforeClass javna statička praznina setUpTripleInstance () {triple = Triple.of ("leftElement", "middleElement", "rightElement"); } @Test javna praznina kada jeCalledgetLeft_thenCorrect () {assertThat (triple.getLeft ()). IsEqualTo ("leftElement"); } @Test javna praznina kada jeCalledgetMiddle_thenCorrect () {assertThat (triple.getMiddle ()). IsEqualTo ("middleElement"); } @Test public void whenCalledgetRight_thenCorrect () {assertThat (triple.getRight ()). IsEqualTo ("rightElement"); }

Postoje i konkretne implementacije za promjenjive i nepromjenjive trojke kroz PromjenjivTrostruki i NepromjenjiviTrostruki razreda.

Njihove instance možemo stvoriti putem parametarskih konstruktora, umjesto statičkom tvorničkom metodom.

U ovom ćemo ih slučaju samo preskočiti, jer njihovi API-ji izgledaju vrlo slično onima iz Promjenjivi par i Nepromjenjivi par razreda.

16. Zaključak

U ovom uputstvu detaljno smo pogledali neke od najkorisnijih klasa korisnih programa koje Apache Commons Lang 3 pruža isključiti polica .

Knjižnica provodi mnoge druge korisne razrede koje vrijedi pogledati. Ovdje smo upravo prikazali najkorisnije na temelju prilično uvjerljivog kriterija.

Za potpuni API biblioteke provjerite službeni Javadocs.

Kao i obično, svi uzorci koda prikazani u ovom vodiču dostupni su na GitHubu.