Annullerer Type i Java

1. Oversigt

Som Java-udviklere har vi muligvis stødt på Ugyldig skriv ved en lejlighed og spekulerede på, hvad formålet var.

I denne hurtige vejledning lærer vi om denne ejendommelige klasse og ser hvornår og hvordan man bruger den samt hvordan man undgår at bruge den, når det er muligt.

2. Hvad er det? Ugyldig Type

Siden JDK 1.1 giver Java os Ugyldig type. Dens formål er simpelthen at repræsentere ugyldig returtype som klasse og indeholder en Klasse offentlig værdi. Det kan ikke instantieres, da dets eneste konstruktør er privat.

Derfor er den eneste værdi, vi kan tildele en Ugyldig variabel er nul. Det kan virke lidt ubrugeligt, men vi ser nu, hvornår og hvordan man bruger denne type.

3. Anvendelser

Der er nogle situationer, når du bruger Ugyldig type kan være interessant.

3.1. Afspejling

For det første kunne vi bruge det, når vi reflekterer. Ja, returtypen for enhver ugyldig metoden svarer til Ugyldig.TYPE variabel, der holder Klasse værdi nævnt tidligere.

Lad os forestille os en simpel Lommeregner klasse:

offentlig klasse lommeregner {privat int resultat = 0; public int add (int number) {return result + = number; } public int sub (int number) {return result - = number; } offentlig tomrum rydde () {resultat = 0; } offentlig ugyldig udskrivning () {System.out.println (resultat); }}

Nogle metoder returnerer et heltal, andre returnerer ikke noget. Lad os nu sige, at vi skal hente, ved refleksion, alle metoder, der ikke returnerer noget resultat. Vi opnår dette ved at bruge Ugyldig.TYPE variabel:

@Test ugyldigt givenCalculator_whenGettingVoidMethodsByReflection_thenOnlyClearAndPrint () {Metode [] calculatorMethods = Calculator.class.getDeclaredMethods (); Liste calculatorVoidMethods = Arrays.stream (calculatorMethods) .filter (metode -> method.getReturnType (). Er lig med (Void.TYPE)) .collect (Collectors.toList ()); assertThat (calculatorVoidMethods) .allMatch (metode -> Arrays.asList ("clear", "print") indeholder (method.getName ())); }

Som vi kan se, er kun den klar() og Print() metoder er blevet hentet.

3.2. Generiske stoffer

En anden brug af Ugyldig typen er med generiske klasser. Lad os antage, at vi kalder en metode, der kræver en Kan kaldes parameter:

offentlig klasse Udskyd {offentlig statisk V-udsættelse (kaldbar kaldbar) kaster undtagelse {retur kaldbar.call (); }}

Men Kan kaldes vi ønsker at passere behøver ikke at returnere noget. Derfor kan vi videregive en Kan kaldes:

@Test ugyldigt givenVoidCallable_whenDiffer_thenReturnNull () kaster undtagelse {Callable callable = new Callable () {@Override public Void call () {System.out.println ("Hello!"); returnere null; }}; assertThat (Defer.defer (callable)). erNull (); }

Vi kunne enten have brugt en tilfældig type (f.eks. Kan kaldes) og vend tilbage nul eller slet ingen type (Kan kaldes), men ved brug af Ugyldig siger vores intentioner klart.

Vi kan også anvende denne metode på lambdas. Faktisk er vores Kan kaldes kunne have været skrevet som en lambda. Lad os forestille os en metode, der kræver en Fungere, men vi vil bruge en Fungere det returnerer ikke noget. Så er vi bare nødt til at få det tilbage Ugyldig:

offentlig statisk R-udsættelse (Funktionsfunktion, T arg) {returfunktion. anvend (arg); }
@Test ugyldigt givenVoidFunction_whenDiffer_thenReturnNull () {Funktionsfunktion = s -> {System.out.println ("Hej" + s + "!"); returnere null; }; assertThat (Defer.defer (funktion, "Verden")). er Null (); }

4. Hvordan undgår man at bruge det?

Nu har vi set nogle anvendelser af Ugyldig type. Men selvom den første brug er helt fin, vi vil måske undgå at bruge Ugyldig i generiske lægemidler, hvis det er muligt. Faktisk at støde på en returtype, der repræsenterer fraværet af et resultat og kun kan indeholde nul kan være besværligt.

Vi ser nu, hvordan man undgår disse situationer. Lad os først overveje vores metode med Kan kaldes parameter. For at undgå at bruge en Kan kaldes, kan vi tilbyde en anden metode til at tage en Kan køres parameter i stedet:

offentlig statisk ugyldig udsættelse (Runnable runnable) {runnable.run (); }

Så vi kan videregive det a Kan køres som ikke returnerer nogen værdi og dermed slippe af med de ubrugelige returner null:

Runnable runnable = new Runnable () {@Override public void run () {System.out.println ("Hej!"); }}; Udskyd udsættelse (kan køres);

Men hvad så hvis Udsætte klasse er ikke vores at ændre? Så kan vi enten holde os til Kan kaldes valgmulighed eller Opret en anden klasse, der tager en Kan køres og udsætte opkaldet til Udsætte klasse:

offentlig klasse MyOwnDefer {offentlig statisk ugyldig udsættelse (Runnable kører) kaster Undtagelse {Defer.defer (new Callable () {@Override public Void call () {runnable.run (); return null;}}); }}

Ved at gøre det indkapsler vi den besværlige del en gang for alle i vores egen metode, så fremtidige udviklere kan bruge en enklere API.

Selvfølgelig kan det samme opnås for Fungere. I vores eksempel er Fungere returnerer ikke noget, så vi kan give en anden metode til at tage en Forbruger i stedet:

offentlig statisk ugyldig udsættelse (Forbrugerforbruger, T arg) {forbruger.accept (arg); }

Hvad så hvis vores funktion ikke tager nogen parameter? Vi kan enten bruge en Kan køres eller opret vores egen funktionelle grænseflade (hvis det virker klarere):

offentlig grænseflade Handling {ugyldig udfør (); }

Så overbelaster vi udsætte() metode igen:

offentlig statisk ugyldig udsættelse (Handlingshandling) {handling.execute (); }
Handlingshandling = () -> System.out.println ("Hej!"); Udskyd udsættelse (handling);

5. Konklusion

I denne korte artikel dækkede vi Java Ugyldig klasse. Vi så, hvad formålet var, og hvordan man brugte det. Vi lærte også nogle alternativer til dets anvendelse.

Som sædvanlig kan den fulde kode for denne artikel findes på vores GitHub.