Void Skriv inn Java

1. Oversikt

Som Java-utviklere har vi kanskje møtt Tomrom skriv ved en anledning og lurte på hva formålet var.

I denne raske opplæringen vil vi lære om denne særegne klassen og se når og hvordan du bruker den, samt hvordan du kan unngå å bruke den når det er mulig.

2. Hva er det? Tomrom Type

Siden JDK 1.1 gir Java oss Tomrom type. Hensikten er ganske enkelt å representere tomrom returtype som klasse og inneholder en Klasse offentlig verdi. Det er ikke øyeblikkelig, da den eneste konstruktøren er privat.

Derfor er den eneste verdien vi kan tildele en Tomrom variabel er null. Det kan virke litt ubrukelig, men vi får nå se når og hvordan du bruker denne typen.

3. Bruk

Det er noen situasjoner når du bruker Tomrom type kan være interessant.

3.1. Speilbilde

Først kunne vi bruke det når vi reflekterte. Faktisk, returtypen til hvilken som helst tomrom metoden vil matche Utgår.TYPE variabel som holder Klasse verdi nevnt tidligere.

La oss forestille oss en enkel Kalkulator klasse:

offentlig klasse Kalkulator {privat int resultat = 0; public int add (int number) {return result + = number; } public int sub (int number) {return result - = number; } public void clear () {result = 0; } offentlig ugyldig utskrift () {System.out.println (resultat); }}

Noen metoder returnerer et helt tall, andre gir ikke noe. La oss si at vi må hente, ved refleksjon, alle metoder som ikke gir noe resultat. Vi oppnår dette ved å bruke Utgår.TYPE variabel:

@Test ugyldig givenCalculator_whenGettingVoidMethodsByReflection_thenOnlyClearAndPrint () {Method [] calculatorMethods = Calculator.class.getDeclaredMethods (); List calculatorVoidMethods = Arrays.stream (calculatorMethods) .filter (metode -> method.getReturnType (). Er lik (Void.TYPE)) .collect (Collectors.toList ()); assertThat (calculatorVoidMethods) .allMatch (metode -> Arrays.asList ("clear", "print"). inneholder (method.getName ())); }

Som vi kan se, er bare klar() og skrive ut() metoder har blitt hentet.

3.2. Generiske

En annen bruk av Tomrom typen er med generiske klasser. La oss anta at vi kaller en metode som krever en Kan kalles parameter:

offentlig klasse Utsett {offentlig statisk V-utsettelse (Callable callable) kaster Unntak {return callable.call (); }}

Men Kan kalles vi ønsker å passere trenger ikke å returnere noe. Derfor kan vi passere en Kan kalles:

@Test ugyldig givenVoidCallable_whenDiffer_thenReturnNull () kaster Unntak {Callable callable = new Callable () {@Override public Void call () {System.out.println ("Hello!"); return null; }}; assertThat (Defer.defer (callable)). isNull (); }

Vi kunne enten ha brukt en tilfeldig type (f.eks. Kan kalles) og returner null eller ingen type i det hele tatt (Callable), men ved hjelp av Tomrom sier våre intensjoner tydelig.

Vi kan også bruke denne metoden på lambdas. Faktisk, vår Kan kalles kunne ha blitt skrevet som en lambda. La oss forestille oss en metode som krever en Funksjon, men vi vil bruke en Funksjon som ikke gir noe tilbake. Da må vi bare få det tilbake Tomrom:

offentlig statisk R-utsettelse (Funksjonsfunksjon, T arg) {returfunksjon. bruk (arg); }
@Test ugyldig givenVoidFunction_whenDiffer_thenReturnNull () {Funksjonsfunksjon = s -> {System.out.println ("Hei" + s + "!"); return null; }; assertThat (Defer.defer (funksjon, "Verden")). er Null (); }

4. Hvordan unngå å bruke det?

Nå har vi sett noen bruksområder av Tomrom type. Men selv om den første bruken er helt grei, vi vil kanskje unngå å bruke Tomrom i generiske legemidler hvis mulig. Faktisk å møte en returtype som representerer fraværet av et resultat og bare kan inneholde null kan være tungvint.

Vi får nå se hvordan vi kan unngå disse situasjonene. La oss først vurdere metoden vår med Kan kalles parameter. For å unngå å bruke en Kan kalles, kan vi tilby en annen metode å ta en Kjørbar parameter i stedet:

offentlig statisk ugyldig utsettelse (Runnable runnable) {runnable.run (); }

Så vi kan gi den en Kjørbar som ikke gir noen verdi og dermed blir kvitt de ubrukelige return null:

Runnable runnable = new Runnable () {@Override public void run () {System.out.println ("Hello!"); }}; Utsett. Utsatt (kan kjøres);

Men hva, hvis Utsette klasse er ikke vår å endre? Da kan vi enten holde oss til Kan kalles alternativ eller lage en annen klasse som tar en Kjørbar og utsetter samtalen til Utsette klasse:

public class MyOwnDefer {public static void defer (Runnable runnable) throw Exception {Defer.defer (new Callable () {@Override public Void call () {runnable.run (); return null;}}); }}

Ved å gjøre det innkapsler vi den tungvint delen en gang for alle i vår egen metode, slik at fremtidige utviklere kan bruke et enklere API.

Selvfølgelig kan det samme oppnås for Funksjon. I vårt eksempel, den Funksjon returnerer ingenting, slik at vi kan tilby en annen metode å ta en Forbruker i stedet:

offentlig statisk ugyldig utsettelse (Consumer consumer, T arg) {consumer.accept (arg); }

Hva om funksjonen vår ikke tar noen parameter? Vi kan enten bruke en Kjørbar eller lag vårt eget funksjonelle grensesnitt (hvis det virker tydeligere):

offentlig grensesnitt Handling {void execute (); }

Så overbelaster vi utsette() metoden igjen:

public static void defer (Action action) {action.execute (); }
Handlingshandling = () -> System.out.println ("Hei!"); Utsett. Utsett (handling);

5. Konklusjon

I denne korte artikkelen dekket vi Java Tomrom klasse. Vi så hva som var hensikten og hvordan vi skulle bruke den. Vi har også lært noen alternativer til bruken.

Som vanlig kan du finne den fulle koden i denne artikkelen på GitHub.


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