Erklæring om Java-bryter

1. Oversikt

I denne opplæringen lærer vi hva bytte om uttalelse er og hvordan du bruker den.

De bytte om uttalelse lar oss erstatte flere nestede hvis-annet konstruerer og dermed forbedrer lesbarheten til koden vår.

Bytte om har utviklet seg over tid - nye støttede typer er lagt til, spesielt i Java 5 og 7. Den fortsetter å utvikle seg - bytte om uttrykk vil trolig bli introdusert i Java 12.

Nedenfor vil vi gi noen kodeeksempler for å demonstrere bruken av bytte om uttalelse, rollen til gå i stykker uttalelse, kravene til bytte om argument/sak verdier og sammenligning av Strings i en bryter uttalelse.

La oss gå videre til eksemplet.

2. Eksempel på bruk

La oss si, vi har følgende nestet hvis-annet uttalelser:

public String exampleOfIF (String animal) {String result; if (animal.equals ("DOG") || animal.equals ("CAT")) {result = "husdyr"; } annet hvis (animal.equals ("TIGER")) {result = "wild animal"; } annet {resultat = "ukjent dyr"; } returnere resultat; }

Ovennevnte kode ser ikke bra ut og vil være vanskelig å vedlikeholde og resonnere om. For å forbedre lesbarheten kan vi bruke en bytte om uttalelse her:

public String exampleOfSwitch (String animal) {String result; switch (animal) {case "DOG": result = "husdyr"; gå i stykker; case "CAT": result = "husdyr"; gå i stykker; case "TIGER": result = "wild animal"; gå i stykker; standard: resultat = "ukjent dyr"; gå i stykker; } returnere resultat; }

Som vist ovenfor, sammenligner vi bytte om argument dyr med flere sak verdier. Hvis ingen av de sak verdier er lik argumentet, deretter blokken under misligholde etiketten er utført.

Enkelt sagt, den gå i stykker uttalelse brukes til å avslutte a bytte om uttalelse.

3. Den gå i stykker Uttalelse

Selv om det meste av bytte om uttalelser i det virkelige liv innebærer at bare en av sak blokker skal utføres, pausen uttalelse er nødvendig for å avslutte en bytte om etter at blokken er fullført.

Hvis vi glemmer å skrive en gå i stykker, vil blokkene under bli utført.

For å demonstrere dette, la oss utelate gå i stykker utsagn og legg utdataene til konsollen for hver blokk:

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

La oss utføre denne koden forgetBreakInSwitch("HUND"), og sjekk utdataene for å bevise at alle blokkene blir utført:

husdyr ukjent dyr

Så vi bør være forsiktige og legge til gå i stykker uttalelser på slutten av hver blokk, med mindre det er behov for å gå videre til koden under neste etikett.

Den eneste blokken der en gå i stykker er ikke nødvendig er den siste, men å legge til en gå i stykker til siste blokk gjør koden mindre feilutsatt.

Vi kan også dra nytte av denne oppførselen til utelate gå i stykker når vi vil at den samme koden skal utføres for flere saksuttalelser. La oss skrive eksemplet i forrige avsnitt om ved å gruppere de to første tilfellene:

public String exampleOfSwitch (String animal) {String result; switch (animal) {case "DOG": case "CAT": result = "husdyr"; gå i stykker; tilfelle "TIGER": resultat = "vilt dyr"; gå i stykker; standard: resultat = "ukjent dyr"; gå i stykker; } returnere resultat; }

4. bytte om Argument og sak Verdier

La oss nå diskutere de tillatte typene bytte om argument og sak verdier, kravene til dem og hvordan bytte om uttalelse fungerer med Strings.

4.1. Datatyper

Vi kan ikke sammenligne alle typer objekter og primitiver i bytte om uttalelse. EN bytte om fungerer bare med fire primitiver og innpakningene, samt med enum-type og String klasse:

  • byte og Byte
  • kort og Kort
  • int og Heltall
  • røye og Karakter
  • enum
  • String

String typen er tilgjengelig i bytte om uttalelse som starter med Java 7.

enum ble introdusert i Java 5 og har vært tilgjengelig i bytte om uttalelse siden den gang.

Wrapper-klasser har også vært tilgjengelige siden Java 5.

Selvfølgelig, bytte om argument og sak verdiene skal være av samme type.

4.2. Nei null Verdier

Vi kan ikke passere null verdi som argument for a bytte om uttalelse. Hvis vi gjør det, vil programmet kaste NullPointerException, bruker vår første bytte om eksempel:

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

Selvfølgelig kan vi ikke passere null som en verdi for sak merkelapp for en bytte om uttalelse. Hvis vi gjør det, vil ikke koden kompilere.

4.3. Sak Verdier som kompileringstidskonstanter

Hvis vi prøver å erstatte HUND saksverdi med variabelen hund koden kompileres ikke før vi markerer hund variabel som endelig:

siste strenghund = "HUND"; Strengkatt = "CAT"; switch (animal) {case dog: // compiles result = "husdyr"; case cat: // kompilerer ikke resultat = "feline"}

4.4. String Sammenligning

Hvis en bytte om uttalelse brukte likhetsoperatøren til å sammenligne strenger vi ikke kunne sammenligne en String argument opprettet med ny operatør til en String saksverdi riktig.

Heldigvis, den bytte om bruker operatøren er lik() metode under panseret.

La oss demonstrere dette:

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

5. bytte om Uttrykkene

JDK 13 er nå tilgjengelig og gir en forbedret versjon av en ny funksjon som først ble introdusert i JDK 12: bytte om uttrykk.

For å aktivere det, må vi passere –Aktivere forhåndsvisning til kompilatoren.

5.1. Den nye bytte om Uttrykk

La oss se hva det nye er bytte om uttrykk ser ut når du bytter over måneder:

var resultat = bytte (måned) {sak JANUAR, JUNI, JULI -> 3; sak FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DESEMBER -> 1; sak MARS, MAI, APRIL, AUGUST -> 2; standard -> 0; }; 

Sender inn en verdi som Måned. JUNI ville sette resultat til 3.

Legg merke til at den nye syntaksen bruker ->i stedet for tykktarmen vi er vant til med bytte om uttalelser. Dessuten er det ingen gå i stykker nøkkelord: The bytte om uttrykk faller ikke gjennom saks.

Et annet tillegg er det faktum at vi nå kan ha kommaavgrensede kriterier.

5.2. De utbytte Nøkkelord

Går du litt lenger, er det en mulighet for å få finkornet kontroll over hva som skjer på høyre side av uttrykket ved hjelp av kodeblokker. I et slikt tilfelle må vi bruke nøkkelordet utbytte:

var resultat = bytte (måned) {sak JANUAR, JUNI, JULI -> 3; sak FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DESEMBER -> 1; sak MARS, MAI, APRIL, AUGUST -> {int månedLengde = måned.tilString (). lengde (); avkastningsmånedLengde * 4; } standard -> 0; };

Mens eksemplet vårt er litt vilkårlig, er poenget her at vi har tilgang til mer av Java-språket her.

5.3. Tilbake inne bytte om Uttrykkene

Som en konsekvens av skillet mellom bytte om uttalelser og bytte om uttrykkene, det er mulig å komme tilbake fra innsiden a bytte om uttalelse, men vi har ikke lov til å gjøre det innenfra a bytte om uttrykk.

Følgende eksempel er helt gyldig og vil kompilere:

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

Følgende kode vil imidlertid ikke kompileres, slik vi prøver å gjøre komme tilbake utenfor et omsluttende bryteruttrykk:

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

5.4. Utmattelse

Når du bruker bytte om uttalelser, det spiller ingen rolle om alle saker er dekket.

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

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

Til bytte om uttrykk skjønt, insisterer kompilatoren på det alle mulige saker dekkes. Følgende kodebit, for eksempel, ville ikke kompilere, da det ikke er noen standardtilfelle, og ikke alle mulige tilfeller dekkes:

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

De bytte om uttrykk vil imidlertid være gyldig når alle mulige tilfeller er dekket, som i følgende eksempel:

var resultat = bytte (måned) {sak JANUAR, JUNI, JULI -> 3; sak FEBRUAR, SEPTEMBER, OKTOBER, NOVEMBER, DESEMBER -> 1; sak MARS, MAI, APRIL, AUGUST -> 2; }

Vær oppmerksom på at kodebiten ovenfor ikke har en misligholde sak. Så lenge alle saker er dekket, er bytte om uttrykk vil være gyldig.

6. Konklusjon

I denne opplæringen har vi lært finessene ved å bruke bytte om uttalelse i Java. Vi kan bestemme om vi skal bruke bytte om basert på lesbarhet og typen sammenlignede verdier.

Bytteerklæringen er en god kandidat for tilfeller der vi har et begrenset antall alternativer i et forhåndsdefinert sett (f.eks. Ukedager). Ellers må vi endre koden hver gang en ny verdi legges til eller fjernes, noe som kanskje ikke er mulig. I disse tilfellene bør vi vurdere andre tilnærminger som polymorfisme eller andre designmønstre som Command.

Som alltid er den komplette JDK 8-koden og JDK 13-koden tilgjengelig på GitHub.


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