Tip praznine u Javi

1. Pregled

Kao programeri Jave, možda smo se susreli s Poništiti tipa nekom prilikom i pitao se koja je njegova svrha.

U ovom brzom uputstvu naučit ćemo o ovoj neobičnoj klasi i vidjeti kada i kako je koristiti, kao i kako izbjeći upotrebu kad je to moguće.

2. Što je Poništiti Tip

Od JDK 1.1, Java nam nudi Poništiti tip. Njegova je svrha jednostavno predstavljanje poništiti return tip kao klasa i sadrži a Razred javna vrijednost. Nije instantabilan jer mu je jedini konstruktor private.

Stoga, jedinu vrijednost koju možemo dodijeliti a Poništiti varijabla je null. Možda se čini pomalo beskorisnim, ali sada ćemo vidjeti kada i kako koristiti ovu vrstu.

3. Upotrebe

Postoje neke situacije kada koristite Poništiti tip može biti zanimljiv.

3.1. Odraz

Prvo, mogli bismo ga koristiti kad razmišljamo. Doista, vrsta povrata bilo koje poništiti metoda će odgovarati Praznina.TIP varijabla koja sadrži Razred vrijednost spomenuta ranije.

Zamislimo jednostavan Kalkulator razred:

Kalkulator javne klase {private int rezultat = 0; javni int dodaj (int broj) {rezultat rezultata + = broj; } public int sub (int number) {return rezultat - = broj; } javna praznina clear () {rezultat = 0; } public void print () {System.out.println (rezultat); }}

Neke metode vraćaju cijeli broj, neke ne vraćaju ništa. Sad, recimo da moramo odrazom dohvatite sve metode koje ne daju nikakav rezultat. To ćemo postići pomoću Praznina.TIP varijabla:

@Test void givenCalculator_whenGettingVoidMethodsByReflection_thenOnlyClearAndPrint () {Method [] calculatorMethods = Calculator.class.getDeclaredMethods (); Popis calculatorVoidMethods = Nizovi.stream (calculatorMethods) .filter (method -> method.getReturnType (). Je jednako (Void.TYPE)) .collect (Collectors.toList ()); assertThat (calculatorVoidMethods) .allMatch (method -> Arrays.asList ("clear", "print"). contains (method.getName ())); }

Kao što vidimo, samo čisto() i ispis () pronađene su metode.

3.2. Generički lijekovi

Još jedna upotreba Poništiti tip je s generičkim klasama. Pretpostavimo da zovemo metodu koja zahtijeva a Pozivno parametar:

javna klasa Defer {javna statička V defer (Callable callable) baca Exception {return callable.call (); }}

Ali Pozivno želimo proći ne mora ništa vratiti. Stoga možemo proći a Pozivno:

@Test void givenVoidCallable_whenDiffer_thenReturnNull () baca izuzetak {Callable callable = new Callable () {@Override public Void call () {System.out.println ("Hello!"); return null; }}; assertThat (Odgodi.odgodi (poziva se)). isNull (); }

Mogli bismo koristiti bilo slučajni tip (npr. Pozivno) i vratiti null ili uopće nema tipa (Dozivno), ali koristeći Poništiti jasno iznosi naše namjere.

Ovu metodu možemo primijeniti i na lambde. Zapravo, naša Pozivno mogao biti napisan kao lambda. Zamislimo metodu koja zahtijeva Funkcija, ali želimo koristiti a Funkcija to ne vraća ništa. Tada se jednostavno moramo vratiti Poništiti:

javna statička R defer (funkcija funkcije, T arg) {return function.apply (arg); }
@Test void givenVoidFunction_whenDiffer_thenReturnNull () {Function function = s -> {System.out.println ("Hello" + s + "!"); return null; }; assertThat (Odgodi.defer (funkcija, "Svijet")). isNull (); }

4. Kako izbjeći upotrebu?

Sada smo vidjeli neke običaje Poništiti tip. Međutim, čak i ako je prva upotreba potpuno u redu, možda bismo htjeli izbjeći upotrebu Poništiti u generičkim lijekovima ako je moguće. Doista, susret s povratnim tipom koji predstavlja odsutnost rezultata i može sadržavati samo null može biti glomazan.

Sad ćemo vidjeti kako izbjeći ove situacije. Prvo, razmotrimo našu metodu s Pozivno parametar. Da biste izbjegli upotrebu a Pozivno, mogli bismo ponuditi drugu metodu uzimanja a Izvodljivo parametar umjesto:

javna statička odgoda praznine (izvodljivo za izvođenje) {runnable.run (); }

Dakle, možemo ga proći a Izvodljivo koji ne vraća nikakvu vrijednost i tako se rješava beskorisnog return null:

Izvodljivo izvodljivo = novo Izvodljivo () {@Preuzmi javno void vođenje () {System.out.println ("Pozdrav!"); }}; Odgoditi.odgoditi (pokrenuti);

Ali onda, što ako Odgoditi klasa nije naša za izmjenu? Tada se možemo držati Pozivno opcija ili stvoriti još jedan razred pohađajući Izvodljivo i odgađanje poziva na Odgoditi razred:

javna klasa MyOwnDefer {javna statička void defer (Runnable runnable) baca izuzetak {Defer.defer (new Callable () {@Override public Void call () {runnable.run (); return null;}}); }}

Čineći to, jednom zauvijek enkapsuliramo glomazni dio vlastitom metodom, omogućujući budućim programerima upotrebu jednostavnijeg API-ja.

Naravno, isto se može postići i za Funkcija. U našem primjeru, Funkcija ne vraća ništa, stoga možemo pružiti drugu metodu uzimanja a Potrošač umjesto toga:

javna statička odgoda praznine (Potrošački potrošač, T arg) {consumer.accept (arg); }

Onda, što ako naša funkcija ne uzme nijedan parametar? Možemo koristiti a Izvodljivo ili izradite vlastito funkcionalno sučelje (ako se to čini jasnijim):

javno sučelje Action {void execute (); }

Zatim, preopterećujemo odgoditi() metoda opet:

javna statička odgoda praznine (akcija radnja) {action.execute (); }
Akcija akcije = () -> System.out.println ("Pozdrav!"); Odgoditi.odgoditi (akcija);

5. Zaključak

U ovom kratkom članku obradili smo Javu Poništiti razred. Vidjeli smo koja mu je svrha i kako je koristiti. Također smo naučili neke alternative njegove upotrebe.

Kao i obično, puni kôd ovog članka možete pronaći na našem GitHubu.