Erklæring om Java-switch

1. Oversigt

I denne vejledning lærer vi, hvad kontakt erklæring er, og hvordan man bruger den.

Det kontakt erklæring giver os mulighed for at erstatte flere indlejrede hvis ellers konstruerer og dermed forbedrer læsbarheden af ​​vores kode.

Kontakt har udviklet sig over tid - nye understøttede typer er tilføjet, især i Java 5 og 7. Det fortsætter også med at udvikle sig - kontakt udtryk vil sandsynligvis blive introduceret i Java 12.

Nedenfor giver vi nogle kodeeksempler for at demonstrere brugen af kontakt erklæring, rolle pause erklæring, kravene til kontakt argument/sag værdier og sammenligning af Snors i en afbryder udmelding.

Lad os gå videre til eksemplet.

2. Eksempel på brug

Lad os sige, at vi har følgende indlejrede hvis ellers udsagn:

public String exampleOfIF (String animal) {String result; hvis (animal.equals ("DOG") || animal.equals ("CAT")) {resultat = "husdyr"; } ellers hvis (animal.equals ("TIGER")) {resultat = "vildt dyr"; } andet {resultat = "ukendt dyr"; } returnere resultat }

Ovenstående kode ser ikke godt ud og ville være svært at vedligeholde og begrundelse for. For at forbedre læsbarheden kunne vi bruge en kontakt udsagn her:

public String exampleOfSwitch (String animal) {String result; switch (animal) {case "DOG": result = "husdyr"; pause; case "CAT": result = "husdyr"; pause; sag "TIGER": resultat = "vildt dyr"; pause; standard: resultat = "ukendt dyr"; pause; } returnere resultat }

Som vist ovenfor sammenligner vi kontakt argument dyr med de flere sag værdier. Hvis ingen af ​​de sag værdier er lig med argumentet, derefter blokken under Standard etiket udføres.

Kort sagt, den pause erklæring bruges til at afslutte en kontakt udmelding.

3. Den pause Udmelding

Selvom de fleste af kontakt udsagn i det virkelige liv antyder, at kun en af sag blokke skal udføres, Pausen Erklæring er nødvendig for at afslutte en kontakt efter blokken er afsluttet.

Hvis vi glemmer at skrive en pause, blokke nedenunder vil blive udført.

Lad os udelade for at demonstrere dette pause udsagn og tilføj output til konsollen for hver blok:

public String forgetBreakInSwitch (String animal) {switch (animal) {case "DOG": System.out.println ("husdyr"); standard: System.out.println ("ukendt dyr"); }}

Lad os udføre denne kode forgetBreakInSwitch("HUND"), og kontroller output for at bevise, at alle blokke bliver udført:

husdyr ukendt dyr

Så vi skal være forsigtige og tilføje pause udsagn i slutningen af ​​hver blok, medmindre der er behov for at videregive til koden under den næste etiket.

Den eneste blok, hvor en pause er ikke nødvendigt er den sidste, men tilføjelse af en pause til den sidste blok gør koden mindre fejlbehæftet.

Vi kan også drage fordel af denne adfærd til udelade pause når vi vil have den samme kode udført til flere sagserklæringer. Lad os omskrive eksemplet i det foregående afsnit ved at gruppere de to første sager:

public String exampleOfSwitch (String animal) {String result; switch (animal) {case "DOG": case "CAT": result = "husdyr"; pause; sag "TIGER": resultat = "vildt dyr"; pause; standard: resultat = "ukendt dyr"; pause; } returnere resultat }

4. kontakt Argument og sag Værdier

Lad os nu diskutere de tilladte typer kontakt argument og sag værdier, kravene til dem og hvordan kontakt erklæring fungerer med strenge.

4.1. Datatyper

Vi kan ikke sammenligne alle typer objekter og primitiver i kontakt udmelding. EN kontakt fungerer kun med fire primitiver og deres indpakninger såvel som med enum-type og Snor klasse:

  • byte og Byte
  • kort og Kort
  • int og Heltal
  • char og Karakter
  • enum
  • Snor

Snor typen findes i kontakt erklæring startende med Java 7.

enum blev introduceret i Java 5 og har været tilgængelig i kontakt erklæring siden da.

Wrapper-klasser har også været tilgængelige siden Java 5.

Selvfølgelig, kontakt argument og sag værdier skal være af samme type.

4.2. Ingen nul Værdier

Vi kan ikke passere nul værdi som argument til en kontakt udmelding. Hvis vi gør det, kaster programmet NullPointerException, bruger vores første kontakt eksempel:

@Test (forventet = NullPointerException.class) offentlig ugyldig nårSwitchAgumentIsNull_thenNullPointerException () {Strengdyr = null; Assert.assertEquals ("husdyr", s.exampleOfSwitch (dyr)); }

Selvfølgelig kan vi ikke også bestå nul som en værdi for sag etiket på en kontakt udmelding. Hvis vi gør det, kompileres koden ikke.

4.3. Sag Værdier som kompileringstidskonstanter

Hvis vi prøver at udskifte HUND sagsværdi med variablen hund koden kompileres ikke, før vi markerer hund variabel som endelig:

sidste strenghund = "HUND"; Strengkat = "KAT"; switch (animal) {case dog: // compiles result = "husdyr"; case cat: // kompilerer ikke resultat = "feline"}

4.4. Snor Sammenligning

Hvis en kontakt erklæring brugte ligestillingsoperatøren til at sammenligne strenge, vi ikke kunne sammenligne en Snor argument oprettet med ny operatør til en Snor sagsværdi korrekt.

Heldigvis kontakt bruger bruger lige med() metode under emhætten.

Lad os demonstrere dette:

@Test offentligt ugyldigt nårCompareStrings_thenByEqual () {String animal = new String ("DOG"); assertEquals ("husdyr", s.exampleOfSwitch (dyr)); }

5. kontakt Udtryk

JDK 13 er nu tilgængelig og bringer en forbedret version af en ny funktion, der først blev introduceret i JDK 12: kontakt udtryk.

For at aktivere det skal vi passere –Aktiver-forhåndsvisning til kompilatoren.

5.1. Den nye kontakt Udtryk

Lad os se hvad det nye er kontakt udtryk ser ud, når man skifter over måneder:

var resultat = switch (måned) {sag JANUAR, JUNI, JULI -> 3; sag FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DECEMBER -> 1; sag MARS, MAJ, APRIL, AUGUST -> 2; standard -> 0; }; 

Afsendelse i en værdi som Måned. JUNI ville sætte resultat til 3.

Bemærk, at den nye syntaks bruger ->operatør i stedet for tyktarmen, vi er vant til med kontakt udsagn. Der er også ingen pause nøgleord: The kontakt udtryk falder ikke igennem sags.

En anden tilføjelse er det faktum, at vi nu kan have komma-afgrænsede kriterier.

5.2. Det udbytte Nøgleord

Gå lidt længere er der en mulighed for at opnå finkornet kontrol over, hvad der sker på højre side af udtrykket ved hjælp af kodeblokke. I et sådant tilfælde er vi nødt til at bruge nøgleordet udbytte:

var resultat = switch (måned) {sag JANUAR, JUNI, JULI -> 3; sag FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DECEMBER -> 1; sag MARS, MAJ, APRIL, AUGUST -> {int månedLængde = måned.tilString (). længde (); udbytte månedLængde * 4; } standard -> 0; };

Mens vores eksempel er lidt vilkårligt, er pointen her, at vi har adgang til mere af Java-sproget her.

5.3. Vender tilbage indeni kontakt Udtryk

Som en konsekvens af sondringen mellem kontakt udsagn og kontakt udtryk, det er muligt at Vend tilbage indefra en kontakt erklæring, men vi har ikke lov til at gøre det inden for en kontakt udtryk.

Følgende eksempel er perfekt gyldigt og vil kompilere:

skifte (måned) {sag JANUAR, JUNI, JULI -> {retur 3; } standard -> {retur 0; }}

Følgende kode kompileres dog ikke, som vi prøver at gøre Vend tilbage uden for et omsluttende switch-udtryk:

var resultat = switch (måned) {sag JANUAR, JUNI, JULI -> {retur 3; } standard -> {return 0; }};

5.4. Udtømmende

Ved brug kontakt udsagn, det betyder ikke rigtig, om alle sager er dækket.

Følgende kode er for eksempel perfekt gyldig og vil kompilere:

switch (måned) {sag JANUAR, JUNI, JULI -> 3; sag FEBRUAR, SEPTEMBER -> 1; }

Til kontakt udtryk dog insisterer kompilatoren på det alle mulige sager er dækket. Følgende kodestykke vil f.eks. Ikke kompilere, da der ikke er nogen standardtilfælde, og ikke alle mulige tilfælde er dækket:

var resultat = switch (måned) {sag JANUAR, JUNI, JULI -> 3; sag FEBRUAR, SEPTEMBER -> 1; }

Det kontakt udtryk vil dog være gyldigt, når alle mulige tilfælde er dækket, som i følgende eksempel:

var resultat = switch (måned) {sag JANUAR, JUNI, JULI -> 3; sag FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DECEMBER -> 1; sag MARS, MAJ, APRIL, AUGUST -> 2; }

Bemærk, at ovenstående kodestykke ikke har et Standard sag. Så længe alle sager er dækket, kontakt udtryk er gyldigt.

6. Konklusion

I denne vejledning har vi lært finesserne ved at bruge kontakt erklæring i Java. Vi kan beslutte, om vi skal bruge kontakt baseret på læsbarhed og typen af ​​de sammenlignede værdier.

Switch-erklæringen er en god kandidat til tilfælde, hvor vi har et begrænset antal muligheder i et foruddefineret sæt (f.eks: ugedage). Ellers skulle vi ændre koden hver gang en ny værdi tilføjes eller fjernes, hvilket muligvis ikke er muligt. I disse tilfælde skal vi overveje andre tilgange som polymorfisme eller andre designmønstre som Command.

Som altid findes den komplette JDK 8-kode og JDK 13-kode på GitHub.


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