Izjava o prebacivanju Java

1. Pregled

U ovom uputstvu naučit ćemo što sklopka iskaz je i kako ga koristiti.

The sklopka naredba omogućuje nam zamjenu nekoliko ugniježđenih ako-drugo konstruira i na taj način poboljšava čitljivost našeg koda.

Sklopka se razvijao tijekom vremena - dodani su novi podržani tipovi, posebno u Javi 5 i 7. Također, nastavlja se razvijati - sklopka izrazi će vjerojatno biti uvedeni u Javi 12.

U nastavku ćemo dati nekoliko primjera koda koji pokazuju upotrebu sklopka izjava, uloga pauza izjava, zahtjevi za sklopka argument/slučaj vrijednosti i usporedba Nizs u prekidač izjava.

Prijeđimo na primjer.

2. Primjer upotrebe

Recimo, imamo sljedeće ugniježđene ako-drugo izjave:

public String exampleOfIF (String animal) {Rezultat niza; if (animal.equals ("DOG") || animal.equals ("CAT")) {rezultat = "domaća životinja"; } else if (animal.equals ("TIGER")) {rezultat = "divlja životinja"; } else {rezultat = "nepoznata životinja"; } vratiti rezultat; }

Gornji kod ne izgleda dobro i teško bi ga bilo održavati i o njemu razmišljati. Za poboljšanje čitljivosti mogli bismo se poslužiti a sklopka izjava ovdje:

public String exampleOfSwitch (String animal) {Rezultat niza; prekidač (životinja) {slučaj "PAS": rezultat = "domaća životinja"; pauza; slučaj "CAT": rezultat = "domaća životinja"; pauza; slučaj "TIGER": rezultat = "divlja životinja"; pauza; zadano: rezultat = "nepoznata životinja"; pauza; } vratiti rezultat; }

Kao što je gore prikazano, uspoređujemo sklopka argument životinja s nekoliko slučaj vrijednosti. Ako nijedan od slučaj values ​​jednak je argumentu, a zatim blok ispod zadano oznaka se izvršava.

Jednostavno rečeno, pauza Izjava se koristi za izlazak iz a sklopka izjava.

3. The pauza Izjava

Iako je većina sklopka Izjave u stvarnom životu impliciraju da je samo jedan od slučaj blokovi trebaju biti izvršeni, pauza Izjava je potrebna za izlazak iz a sklopka nakon završetka bloka.

Ako zaboravimo napisati a pauza, izvršit će se blokovi ispod.

Da bismo to demonstrirali, izostavimo pauza naredbe i dodajte izlaz u konzolu za svaki blok:

javni String zaboravitiBreakInSwitch (String životinja) {prekidač (životinja) {slučaj "DOG": System.out.println ("domaća životinja"); zadano: System.out.println ("nepoznata životinja"); }}

Izvršimo ovaj kod zaboravitiBreakInSwitch("PAS"), i provjerite izlaz kako biste dokazali da se svi blokovi izvršavaju:

domaća životinja nepoznata životinja

Stoga bismo trebali biti oprezni i dodati pauza naredbe na kraju svakog bloka, osim ako nema potrebe za prelaskom na kod pod sljedećom oznakom.

Jedini blok gdje a pauza nije potrebno je posljednji, ali dodavanje a pauza do zadnjeg bloka čini kôd manje sklonim pogreškama.

Ovo ponašanje također možemo iskoristiti za izostaviti pauza kada želimo izvršiti isti kod za nekoliko izjava slučaja. Prepišimo primjer u prethodnom odjeljku grupiranjem prva dva slučaja:

public String exampleOfSwitch (String animal) {Rezultat niza; prekidač (životinja) {slučaj "DOG": slučaj "CAT": rezultat = "domaća životinja"; pauza; slučaj "TIGER": rezultat = "divlja životinja"; pauza; zadano: rezultat = "nepoznata životinja"; pauza; } vratiti rezultat; }

4. sklopka Argument i slučaj Vrijednosti

Sada razgovarajmo o dopuštenim vrstama sklopka argument i slučaj vrijednosti, zahtjevi za njima i kako sklopka izjava radi sa Stringsom.

4.1. Vrste podataka

Ne možemo usporediti sve vrste objekata i primitiva u sklopka izjava. A sklopka radi samo s četiri primitiva i njihovim omotima, kao i s tip nabrajanja i Niz razred:

  • bajt i Bajt
  • kratak i Kratak
  • int i Cijeli broj
  • ugljen i Lik
  • nabrajanje
  • Niz

Niz tip dostupan je u sklopka izjava koja započinje s Javom 7.

nabrajanje type uveden je u Javi 5, a dostupan je u verziji sklopka izjava od tada.

Klase omotača također su dostupne od Jave 5.

Naravno, sklopka argument i slučaj vrijednosti bi trebale biti iste vrste.

4.2. Ne null Vrijednosti

Ne možemo proći null vrijednost kao argument a sklopka izjava. Ako to učinimo, program će baciti NullPointerException, koristeći naš prvi sklopka primjer:

@Test (očekuje se = NullPointerException.class) javna void kadaSwitchAgumentIsNull_thenNullPointerException () {String animal = null; Assert.assertEquals ("domaća životinja", s.exampleOfSwitch (životinja)); }

Naravno, ne možemo i proći null kao vrijednost za slučaj oznaka a sklopka izjava. Ako to učinimo, kod se neće sastaviti.

4.3. Slučaj Vrijednosti kao konstante vremena kompilacije

Ako pokušamo zamijeniti PAS vrijednost slučaja s varijablom pas kod se neće sastaviti dok ne označimo pas varijabla kao konačni:

završni String dog = "DOG"; Niz mačka = "MAČKA"; prekidač (životinja) {case dog: // sastavlja rezultat = "domaća životinja"; case cat: // ne sastavlja rezultat = "mačji"}

4.4. Niz Usporedba

Ako je a sklopka naredba koristi operator jednakosti za usporedbu nizova koje nismo mogli usporediti Niz argument stvoren pomoću novi operater na a Niz vrijednost slučaja ispravno.

Srećom, sklopka operator koristi jednako () metoda ispod haube.

Pokažimo ovo:

@Test public void whenCompareStrings_thenByEqual () {String animal = new String ("DOG"); assertEquals ("domaća životinja", s.exampleOfSwitch (životinja)); }

5. sklopka Izrazi

JDK 13 je sada dostupan i donosi poboljšanu verziju nove značajke koja je prvi put predstavljena u JDK 12: sklopka izraz.

Da bismo to omogućili, moramo proći –Enable-preview sastavljaču.

5.1. Novi sklopka Izraz

Da vidimo što je novo sklopka izraz izgleda kao pri prebacivanju tijekom mjeseci:

var rezultat = prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> 3; slučaj VELJAČA, RUJAN, LISTOPAD, STUDENI, PROSINAC -> 1; slučaj OŽUJAK, SVIBANJ, TRAVNJ, KOLOVOZ -> 2; zadano -> 0; }; 

Slanje u vrijednosti poput Mjesec.LIPANJ postavila bi proizlaziti do 3.

Primijetite da nova sintaksa koristi ->operatora umjesto debelog crijeva na koje smo navikli sklopka izjave. Također, nema pauza ključna riječ: sklopka izraz ne pada slučajs.

Još jedan dodatak je činjenica da sada možemo imati kriterije razgraničene zarezom.

5.2. The prinos Ključna riječ

Idući malo dalje, postoji mogućnost dobivanja precizne kontrole nad onim što se događa s desne strane izraza pomoću blokova koda. U takvom slučaju trebamo upotrijebiti ključnu riječ prinos:

var rezultat = prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> 3; slučaj VELJAČA, RUJAN, LISTOPAD, STUDENI, PROSINAC -> 1; slučaj OŽUJAK, SVIBANJ, TRAVNJ, KOLOVOZ -> {int monthLength = month.toString (). length (); prinos mjesecDužina * 4; } zadano -> 0; };

Iako je naš primjer pomalo proizvoljan, ovdje je stvar u tome da ovdje imamo pristup većem broju jezika Java.

5.3. Povratak iznutra sklopka Izrazi

Kao posljedica razlike između sklopka izjave i sklopka izrazi, moguće je povratak iznutra a sklopka izjava, ali to ne smijemo učiniti iznutra sklopka izraz.

Sljedeći je primjer savršeno valjan i kompilirat će se:

prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> {povratak 3; } zadani -> {return 0; }}

Međutim, sljedeći se kôd neće kompajlirati, kao što to pokušavamo povratak izvan izraza koji obuhvaća prekidač:

var rezultat = prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> {povratak 3; } zadani -> {return 0; }};

5.4. Iscrpnost

Prilikom korištenja sklopka izjave, zapravo nije važno jesu li obuhvaćeni svi slučajevi.

Sljedeći je kod, na primjer, savršeno valjan i kompajlirat će se:

prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> 3; slučaj VELJAČA, RUJAN -> 1; }

Za sklopka izraza, kompajler inzistira na tome obuhvaćeni su svi mogući slučajevi. Sljedeći isječak koda, na primjer, ne bi se preveo, jer ne postoji zadani slučaj i nisu obuhvaćeni svi mogući slučajevi:

var rezultat = prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> 3; slučaj VELJAČA, RUJAN -> 1; }

The sklopka izraz će, međutim, vrijediti kada su obuhvaćeni svi mogući slučajevi, kao u sljedećem primjeru:

var rezultat = prekidač (mjesec) {slučaj SIJEČANJ, LIPANJ, SRPANJ -> 3; slučaj VELJAČA, RUJAN, LISTOPAD, STUDENI, PROSINAC -> 1; slučaj OŽUJAK, SVIBANJ, TRAVNJ, KOLOVOZ -> 2; }

Napominjemo da gornji isječak koda nema zadano slučaj. Sve dok su obuhvaćeni svi slučajevi, sklopka izraz će biti valjan.

6. Zaključak

U ovom uputstvu naučili smo suptilnosti korištenja sklopka izjava na Javi. Možemo odlučiti hoćemo li koristiti sklopka na temelju čitljivosti i vrste uspoređenih vrijednosti.

Izjava o prebacivanju dobar je kandidat za slučajeve kada imamo ograničeni broj opcija u unaprijed definiranom skupu (npr. Dani u tjednu). U suprotnom, kôd bismo morali mijenjati svaki put kad se doda ili ukloni nova vrijednost, što možda nije izvedivo. U tim bismo slučajevima trebali razmotriti druge pristupe poput polimorfizma ili drugih dizajnerskih obrazaca poput Commanda.

Kao i uvijek kompletni JDK 8 kôd i JDK 13 kôd dostupan je na GitHubu.