Når du skriver kode med mange betingelser, har du sikkert brukt enten en if-else eller en switch- setning. Men dette alternativet til if-else har ulemper. Noen mennesker har til og med kalt brytersetningen et "antimønster".

Hva er det? Et anti-mønster er et vanlig mønster av dårlig kode, dvs. en dårlig løsning på et problem. Programmerere prøver å unngå dem i kode, siden de forringer kodekvaliteten.

Men det er gode nyheter: nye versjoner av Java har ført til mange endringer i språkets syntaks, og en av disse endringene påvirker switch . fascinert? Så la oss dykke inn.

Til å begynne med er det verdt å avklare hvorfor bryteren er et antimønster. Tenk på følgende kode:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    default:
        seasonNumber = 0;
}

Ok, så det er ennå ikke helt klart hvorfor dette er et "anti-mønster".

Men hva om vi legger til flere saksblokker og nå ser koden slik ut:


switch (condition) {
    case "DECEMBER":
        seasonNumber = 1;
        break;
    case "JANUARY":
        seasonNumber = 1;
        break;
    case "FEBRUARY":
        seasonNumber = 1;
        break;
    case “MARCH”:
        seasonNumber = 2;
        break;
    case “APRIL”:
        seasonNumber = 2;
        break;
    case “MAY”:
        seasonNumber = 2;
        break;
    default:
        seasonNumber = 0;
}

La oss legge til noen flere linjer - koden blir lengre. Senere kan vi legge til flere og flere linjer, og ingen vil stoppe oss fra å gjøre dette.

Dette er kjernen i problemet: etter å ha opprettet en kompakt brytersetning , legger vi til mer og mer kode til den, tar opp mer og mer plass – mer enn det som får plass på skjermen – og gjør koden upraktisk å lese og vedlikeholde.

Forskjellen mellom switch-setningen og switch-uttrykket

Java 14 introduserte en ny og forbedret bryter. Det er ikke en switch-setning , men snarere et switch-uttrykk .

Hva er forskjellen, spør du? Forskjellen er at en setning er en instruksjon som utfører et bestemt sett med operasjoner, men et uttrykk er et stykke kode som utfører en viss beregning og returnerer et resultat.

Med andre ord, nå kan du lagre resultatet av en overgang til en variabel.

Nok snakk. La oss nå se hvordan den nye bryteren ser ut:


var result = switch(month) {
     case DECEMBER, JANUARY, FEBRUARY -> 1;
     case MARCH, APRIL, MAY -> 2;
    case JUNE, JULY, AUGUST -> 3;
    case SEPTEMBER, OCTOBER, NOVEMBER -> 4;
    default -> 0; 
};

Det første som fanger oppmerksomheten er hvor kompakt koden er. Koden som pleide å ta opp mesteparten av skjermen spenner nå over noen få linjer og ser mye mer lesbar ut.

-> operatør

Du bør også merke deg -> operatoren (piloperatoren). Du er kanskje allerede kjent med det hvis du har erfaring med lambda-uttrykk.

Det betyr at du nå kan skrive en bryter som ser kul ut i stil med et lambda-uttalelse. Piloperatoren indikerer at kompilatoren ikke vil fortsette til neste kasusuttrykk (hvis gjeldende kasusblokk mangler en break- eller return -setning), men vil i stedet gi deg verdien av uttrykket til høyre for pilen.

Du kan også skrive kode som ikke er et uttrykk og bare utføre visse handlinger i stedet for å returnere noe:


switch(condition) {
    case TRUE, FALSE -> System.out.println("True/false");
  
    default -> System.out.println("Another");
}

Merk at bryteren ikke lenger har en pauseerklæring . Den ble fjernet i Java 13 og erstattet med yield .

Hva er utbytte og hvor kan det brukes?

Når en bryter består av en enkelt linje, returnerer ->- operatoren selv verdien. Men hva om vi ikke har én, men mange linjer med kode? I slike tilfeller vil ikke piloperatoren returnere en verdi, siden det er flere linjer, ikke én.

Kanskje vi kan bruke retur ? Tross alt brukes den til å returnere verdier i Java. Akk, nei, retur vil ikke fungere med en bryter. Så hva kan vi bruke? Det pleide å være break , men det ble fjernet i Java 13. Men i stedet har vi nå yield – et nytt nøkkelord som hjelper deg med å returnere en verdi fra en bryter. Det er analogt med å returnere utsagn i metoder.


var result = switch(condition) {
//…
case "Hi" -> "greeting"
//…
};  

Denne koden inneholder en enkelt linje, og ->- operatøren vil returnere "hilsen".

Men når vi har en kodeblokk:


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 Here you need to return "greeting"
	}
};  

Nøkkelordet som vil hjelpe deg med å returnere en verdi er yield :


var result = switch(condition) {
//…
case "Hi" -> {
// Your code
 yield "greeting";

	}
};

yield ble lagt til i Java 13 for tilfeller der vi har mer enn én kodelinje i en saksblokk og vi må returnere et resultat.

Du er sannsynligvis ivrig etter å prøve ut den nye bryteren i koden din, men husk at du trenger Java 14 eller høyere for å gjøre dette. Med tidligere versjoner vil denne bryteren bare være tilgjengelig hvis du spesifiserer "--enable-preview"-flagget på kommandolinjen, siden før versjon 14 var det en del av den tekniske forhåndsvisningen, ikke en fullverdig del av språket.

Det er alt for nå! Ser deg!