Void Type v jazyku Java

1. Prehľad

Ako vývojári Java sme sa mohli stretnúť s Neplatný typu pri nejakej príležitosti a premýšľal, aký bol jeho účel.

V tomto rýchlom výučbe sa dozvieme o tejto zvláštnej triede a uvidíme, kedy a ako ju používať a ako sa jej vyhnúť, keď je to možné.

2. Čo je to Neplatný Typ

Od JDK 1.1 nám Java poskytuje: Neplatný typu. Jeho účelom je jednoducho reprezentovať neplatný návratový typ ako trieda a obsahovať a Trieda verejná hodnota. Nie je možné ho vytvoriť okamžite, pretože jeho jediný konštruktor je súkromný.

Jedinou hodnotou, ktorú môžeme priradiť k a Neplatný premenná je nulový. Môže sa to zdať trochu zbytočné, ale teraz uvidíme, kedy a ako tento typ použiť.

3. Použitie

Pri používaní aplikácie sa vyskytujú situácie Neplatný typ môže byť zaujímavý.

3.1. Odraz

Najprv by sme to mohli použiť pri odraze. Naozaj, návratový typ ľubovoľného neplatný metóda bude zodpovedať Neplatné. TYP premenná, ktorá drží Trieda hodnota uvedená skôr.

Poďme si predstaviť jednoduchý Kalkulačka trieda:

public class Calculator {private int vysledok = 0; public int add (int number) {return result + = number; } public int sub (int cislo) {navrat vysledok - = cislo; } public void clear () {vysledok = 0; } public void print () {System.out.println (vysledok); }}

Niektoré metódy vracajú celé číslo, iné nevracajú nič. Teraz, povedzme, že musíme získať odrazom všetky metódy, ktoré nevrátia žiadny výsledok. Dosiahneme to použitím Neplatné. TYP premenná:

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

Ako vidíme, iba jasný() a print () metódy.

3.2. Generiká

Ďalšie použitie Neplatný typ je s generickými triedami. Predpokladajme, že voláme metódu, ktorá vyžaduje a Vyvolávateľná parameter:

public class Defer {public static V defer (Callable callable) hodí Exception {return callable.call (); }}

Ale Vyvolávateľná chceme prejsť nemusí nič vracať. Preto môžeme zložiť a Vyvolávateľná:

@Test void givenVoidCallable_whenDiffer_thenReturnNull () vyvolá výnimku {Callable callable = new Callable () {@Override public Void call () {System.out.println ("Hello!"); návrat null; }}; assertThat (Defer.defer (volaný)). isNull (); }

Mohli sme použiť buď náhodný typ (napr. Vyvolávateľná) a vrátiť sa nulový alebo vôbec žiadny typ (Vyvolateľné), ale použitím Neplatný jasne uvádza naše zámery.

Túto metódu môžeme použiť aj na lambdy. V skutočnosti naše Vyvolávateľná sa dalo napísať ako lambda. Poďme si predstaviť metódu vyžadujúcu a Funkcia, ale chceme použiť a Funkcia že nič nevráti. Potom už to musíme len vrátiť Neplatný:

public static R defer (Funkčná funkcia, T arg) {návratová funkcia.apply (arg); }
@Test void givenVoidFunction_whenDiffer_thenReturnNull () {Function function = s -> {System.out.println ("Hello" + s + "!"); návrat null; }; assertThat (Defer.defer (funkcia, "svet")). isNull (); }

4. Ako sa vyhnúť nepoužívaniu?

Teraz sme videli niektoré spôsoby použitia Neplatný typu. Aj keď je však prvé použitie úplne v poriadku, možno by sme sa chceli vyhnúť použitiu Neplatný v generikách, ak je to možné. Stretnutie s návratovým typom, ktorý predstavuje absenciu výsledku a ktorý môže obsahovať iba nulový môže byť ťažkopádny.

Teraz uvidíme, ako sa týmto situáciám vyhnúť. Najprv zvážime našu metódu s Vyvolávateľná parameter. Aby sa zabránilo použitiu a Vyvolávateľná, môžeme ponúknuť inú metódu s využitím a Spustiteľné parameter namiesto:

public static void defer (Runnable runnable) {runnable.run (); }

Môžeme to teda odovzdať a Spustiteľné ktorá nevracia žiadnu hodnotu a zbavuje sa tak zbytočností návrat null:

Runnable runnable = new Runnable () {@Override public void run () {System.out.println ("Hello!"); }}; Odložiť.odložiť (spustiteľné);

Ale potom, čo ak Odložiť trieda nie je naša na úpravu? Potom sa môžeme buď držať Vyvolávateľná možnosť alebo vytvoriť ďalšiu triedu s a Spustiteľné a odloženie hovoru na Odložiť trieda:

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

Týmto spôsobom raz za čas zapuzdríme ťažkopádnu časť do svojej vlastnej metódy, čo umožní budúcim vývojárom používať jednoduchšie API.

To isté sa samozrejme dá dosiahnuť aj pre Funkcia. V našom príklade Funkcia nič nevracia, a tak môžeme poskytnúť inú metódu s a Spotrebiteľ namiesto toho:

public static void defer (Consumer consumer, T arg) {consumer.accept (arg); }

Čo potom, keď naša funkcia nemá žiadny parameter? Môžeme použiť buď a Spustiteľné alebo si vytvorte naše vlastné funkčné rozhranie (ak sa vám zdá jasnejšie):

verejné rozhranie Action {void execute (); }

Potom preťažíme odložiť() metóda znova:

public static void defer (Action action) {action.execute (); }
Akcia action = () -> System.out.println ("Dobrý deň!"); Odložiť.odložiť (akcia);

5. Záver

V tomto krátkom článku sme sa venovali Jave Neplatný trieda. Videli sme, aký bol jeho účel a ako ho používať. Dozvedeli sme sa tiež niekoľko alternatív jeho použitia.

Celý kód tohto článku nájdete ako obvykle na našom GitHube.


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