Vyhlásenie Java Switch
1. Prehľad
V tomto výučbe sa dozvieme, čo prepínač vyhlásenie je a ako ho používať.
The prepínač vyhlásenie nám umožňuje nahradiť niekoľko vnorených keby-inak konštrukty a tým zlepšujú čitateľnosť nášho kódu.
Prepnúť sa vyvíjal v priebehu času - boli pridané nové podporované typy, najmä v prostredí Java 5 a 7. Rovnako sa neustále vyvíja - prepínač výrazy budú pravdepodobne zavedené v prostredí Java 12.
Ďalej uvedieme niekoľko príkladov kódu na demonštráciu použitia kódu prepínač vyhlásenie, úloha prestávka vyhlásenie, požiadavky na prepínač argument /prípade hodnoty a porovnanie Strings v prepínač vyhlásenie.
Prejdime k príkladu.
2. Príklad použitia
Povedzme, máme nasledujúce vnorené keby-inak Vyhlásenia:
public String exampleOfIF (String animal) {Výsledok reťazca; if (animal.equals ("DOG") || animal.equals ("CAT")) {result = "domáce zviera"; } else if (animal.equals ("TIGER")) {result = "divoké zviera"; } else {result = "neznáme zviera"; } vrátiť výsledok; }
Vyššie uvedený kód nevyzerá dobre a ťažko by sa udržiaval a zdôvodňoval. Na zlepšenie čitateľnosti by sme mohli využiť a prepínač vyhlásenie tu:
public String exampleOfSwitch (String animal) {Výsledok reťazca; switch (zviera) {case "DOG": result = "domáce zviera"; prestávka; prípad "CAT": výsledok = "domáce zviera"; prestávka; prípad "TIGER": result = "divoké zviera"; prestávka; predvolené: result = "neznáme zviera"; prestávka; } vrátiť výsledok; }
Ako je uvedené vyššie, porovnávame prepínač argument zviera s niekoľkými prípade hodnoty. Ak nič z prípade hodnoty sa rovná argumentu, potom blok pod predvolené štítok je vykonaný.
Jednoducho povedané prestávka príkaz sa používa na ukončenie a prepínač vyhlásenie.
3. The prestávka Vyhlásenie
Aj keď väčšina z prepínač výroky v reálnom živote naznačujú, že iba jeden z prípade bloky by sa mali vykonať, prestávka vyhlásenie je potrebné na ukončenie a prepínač po dokončení bloku.
Ak zabudneme napísať a prestávka, vykonajú sa bloky pod ním.
Aby sme to demonštrovali, vynechajme prestávka príkazy a pridajte výstup do konzoly pre každý blok:
public String forgetBreakInSwitch (String animal) {switch (animal) {case "DOG": System.out.println ("domáce zviera"); predvolené: System.out.println ("neznáme zviera"); }}
Vykonajme tento kód forgetBreakInSwitch("PES"), a skontrolujte výstup, aby ste preukázali, že sa vykonajú všetky bloky:
domáce zviera neznáme zviera
Mali by sme byť teda opatrní a pridávať prestávka príkazy na konci každého bloku, pokiaľ nie je potrebné prejsť do kódu pod nasledujúcim štítkom.
Jediný blok, kde a prestávka nie je potrebné, je posledný, ale pridanie a prestávka do posledného bloku je kód menej náchylný na chyby.
Toto správanie môžeme tiež využiť vynechať prestávka keď chceme vykonať rovnaký kód pre niekoľko príkazov na veľké a malé písmená. Prepíšeme príklad v predchádzajúcej časti zoskupením prvých 2 prípadov:
public String exampleOfSwitch (String animal) {Výsledok reťazca; switch (zviera) {prípad "DOG": prípad "CAT": result = "domáce zviera"; prestávka; prípad "TIGER": result = "divoké zviera"; prestávka; predvolené: result = "neznáme zviera"; prestávka; } vrátiť výsledok; }
4. prepínač Argument a prípade Hodnoty
Teraz poďme diskutovať o povolených druhoch prepínač argument a prípade hodnoty, požiadavky na ne a ako prepínač vyhlásenie pracuje s reťazcami.
4.1. Dátové typy
Nemôžeme porovnať všetky typy objektov a primitívov v prepínač vyhlásenie. A prepínač funguje iba so štyrmi primitívmi a ich obalmi, ako aj s typ enum a String trieda:
- bajt a Byte
- krátky a Krátky
- int a Celé číslo
- char a Postava
- enum
- String
String typ je k dispozícii v prepínač vyhlásenie začínajúce jazykom Java 7.
enum typ bol zavedený v prostredí Java 5 a je k dispozícii v systéme Windows prepínač odvtedy vyhlásenie.
Od verzie Java 5 sú k dispozícii aj triedy obálky.
Samozrejme, prepínač argument a prípade hodnoty by mali byť rovnakého typu.
4.2. Nie nulový Hodnoty
Nemôžeme prejsť nulový hodnota ako argument k a prepínač vyhlásenie. Ak to urobíme, program vyhodí NullPointerException, pomocou našej prvej prepínač príklad:
@Test (očakáva sa = NullPointerException.class) public void whenSwitchAgumentIsNull_thenNullPointerException () {String animal = null; Assert.assertEquals ("domáce zviera", s.exampleOfSwitch (zviera)); }
Samozrejme, nemôžeme tiež prejsť nulový ako hodnota pre prípade štítok a prepínač vyhlásenie. Ak to urobíme, kód sa nezkompiluje.
4.3. Prípad Hodnoty ako konštanty času kompilácie
Ak sa pokúsime vymeniť PES hodnota prípadu s premennou pes kód sa nezhromadí, kým neoznačíme pes premenná ako konečné:
posledný psík = "DOG"; Reťazec cat = "CAT"; switch (zviera) {case pes: // kompiluje vysledok = "domace zviera"; case cat: // neskladá result = "feline"}
4.4. String Porovnanie
Ak prepínač príkaz použil operátor rovnosti na porovnanie reťazcov, ktoré sme nemohli porovnať a String argument vytvorený pomocou Nový operátor na a String hodnota prípadu správne.
Našťastie prepínač operátor používa rovná sa () metóda pod kapotou.
Poďme si to demonštrovať:
@Test public void whenCompareStrings_thenByEqual () {String animal = new String ("DOG"); assertEquals ("domáce zviera", s.exampleOfSwitch (zviera)); }
5. prepínač Výrazy
JDK 13 je teraz k dispozícii a prináša vylepšenú verziu novej funkcie, ktorá bola prvýkrát predstavená v JDK 12: prepínač výraz.
Aby sme to umožnili, musíme prejsť –Povoliť ukážku kompilátorovi.
5.1. Nové prepínač Vyjadrenie
Pozrime sa, čo nové prepínač výraz vyzerá pri prepínaní mesiacov:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3; prípad FEBRUÁR, SEPTEMBRA, OKTÓBRA, NOVEMBRA, DECEMBRA -> 1; prípad MAREC, MÁJ, APRÍL, AUGUST -> 2; predvolené -> 0; };
Posiela sa v hodnote ako Mesiac. JÚN nastavil by výsledok do 3.
Všimnite si, že nová syntax používa znak ->operátor namiesto dvojbodky, na ktorú sme zvyknutí prepínač Vyhlásenia. Tiež tam nie je prestávka kľúčové slovo: The prepínač výraz neprepadá prípades.
Ďalším dodatkom je skutočnosť, že odteraz môžeme mať kritériá oddelené čiarkou.
5.2. The výnos Kľúčové slovo
O niečo ďalej, je tu možnosť získať jemnú kontrolu nad tým, čo sa deje na pravej strane výrazu, pomocou blokov kódu. V takom prípade musíme použiť kľúčové slovo výnos:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3; prípad FEBRUÁR, SEPTEMBRA, OKTÓBRA, NOVEMBRA, DECEMBRA -> 1; prípad MAREC, MÁJ, APRÍL, AUGUST -> {int monthLength = month.toString (). length (); výnosový mesiacDĺžka * 4; } predvolene -> 0; };
Aj keď je náš príklad trochu svojvoľný, ide o to, že tu máme prístup k väčšiemu množstvu jazykov Java.
5.3. Vracia sa dovnútra prepínač Výrazy
V dôsledku rozdielu medzi prepínač vyhlásenia a prepínač výrazy, je možné návrat zvnútra a prepínač vyhlásenie, ale nesmieme to robiť zvnútra a prepínač výraz.
Nasledujúci príklad je úplne platný a bude sa kompilovať:
switch (month) {case JANUARY, JUNE, JULY -> {return 3; } predvolene -> {návrat 0; }}
Nasledujúci kód sa však nebude kompilovať, ako sa snažíme návrat mimo priloženého prepínacieho výrazu:
var result = switch (month) {case JANUARY, JUNE, JULY -> {return 3; } predvolene -> {návrat 0; }};
5.4. Úplnosť
Pri použití prepínač Vyhlásenia, nezáleží na tom, či sú pokryté všetky prípady.
Napríklad nasledujúci kód je úplne platný a bude sa kompilovať:
switch (month) {case JANUARY, JUNE, JULY -> 3; prípad FEBRUÁR, SEPTEMBRA -> 1; }
Pre prepínač prekladač však trvá na tom sú zahrnuté všetky možné prípady. Nasledujúci fragment kódu by sa napríklad nezkompiloval, pretože neexistuje žiadny predvolený prípad a nie sú pokryté všetky možné prípady:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3; prípad FEBRUÁR, SEPTEMBRA -> 1; }
The prepínač výraz však bude platný, keď budú pokryté všetky možné prípady, ako v nasledujúcom príklade:
var result = switch (month) {case JANUARY, JUNE, JULY -> 3; prípad FEBRUÁR, SEPTEMBRA, OKTÓBRA, NOVEMBRA, DECEMBRA -> 1; prípad MAREC, MÁJ, APRÍL, AUGUST -> 2; }
Upozorňujeme, že vyššie uvedený útržok kódu nemá znak predvolené prípade. Pokiaľ sú pokryté všetky prípady, prepínač výraz bude platný.
6. Záver
V tomto tutoriáli sme sa naučili jemnosti používania prepínač vyhlásenie v Jave. Môžeme sa rozhodnúť, či použijeme prepínač na základe čitateľnosti a typu porovnávaných hodnôt.
Vyhlásenie o zmene je dobrým kandidátom pre prípady, keď máme obmedzený počet možností v preddefinovanej množine (napr. Dni v týždni). V opačnom prípade by sme museli kód upravovať zakaždým, keď je pridaná alebo odstránená nová hodnota, čo nemusí byť možné. V týchto prípadoch by sme mali zvážiť ďalšie prístupy, ako napríklad polymorfizmus alebo iné návrhové vzory, napríklad Command.
Úplný kód JDK 8 a JDK 13 je ako vždy k dispozícii na GitHub.