Când scrieți cod cu multe condiții, cu siguranță ați folosit fie o instrucțiune if-else , fie o instrucțiune switch . Dar această alternativă la dacă-altfel are dezavantaje. Unii oameni chiar au numit declarația de comutare drept „anti-model”.

Ce-i asta? Un anti-pattern este un model comun de cod prost, adică o soluție proastă la o problemă. Programatorii încearcă să le evite în cod, deoarece degradează calitatea codului.

Dar există o veste bună: noile versiuni de Java au adus o mulțime de modificări în sintaxa limbajului, iar una dintre aceste modificări afectează comutatorul . Intrigat? Atunci hai să ne scufundăm.

Pentru început, merită să clarificăm de ce comutatorul este un anti-model. Luați în considerare următorul cod:


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

Bine, deci nu este încă pe deplin clar de ce acesta este un „anti-model”.

Dar ce se întâmplă dacă adăugăm mai multe blocuri de caz și acum codul arată astfel:


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;
}

Să mai adăugăm câteva rânduri — codul crește. Mai târziu putem adăuga din ce în ce mai multe rânduri și nimeni nu ne va opri să facem asta.

Acesta este miezul problemei: după ce am creat inițial o instrucțiune de comutare compactă, îi adăugăm din ce în ce mai mult cod, ocupând tot mai mult spațiu – mai mult decât va încăpea pe ecran – și făcând codul incomod de citit și întreținut.

Diferența dintre instrucțiunea switch și expresia switch

Java 14 a introdus un comutator nou și îmbunătățit. Nu este o instrucțiune switch , ci mai degrabă o expresie switch .

Care este diferența, te întrebi? Diferența este că o instrucțiune este o instrucțiune care efectuează un anumit set de operații, dar o expresie este o bucată de cod care efectuează un anumit calcul și returnează un rezultat.

Cu alte cuvinte, acum puteți salva rezultatul unei comutări la o variabilă.

Destul de vorbit. Acum să vedem cum arată noul comutator :


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; 
};

Primul lucru care vă atrage atenția este cât de compact este codul. Codul care ocupa cea mai mare parte a ecranului acum se întinde pe câteva rânduri și pare mult mai ușor de citit.

-> operator

De asemenea, ar trebui să rețineți operatorul -> (operatorul săgeată). Este posibil să fiți deja familiarizat cu el dacă aveți experiență cu expresiile lambda.

Asta înseamnă că acum poți scrie un comutator cu aspect cool în stilul unei declarații lambda. Operatorul săgeată indică faptul că compilatorul nu va trece la următoarea expresie case (dacă blocului de case curent lipsește o instrucțiune break sau return ), ci vă va oferi valoarea expresiei din dreapta săgeții.

De asemenea, puteți scrie cod care nu este o expresie și pur și simplu efectuează anumite acțiuni în loc să returneze ceva:


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

Rețineți că switch nu mai are o declarație break . A fost eliminat în Java 13 și înlocuit cu yield .

Ce este randamentul și unde poate fi folosit?

Când un comutator constă dintr-o singură linie, operatorul -> însuși returnează valoarea. Dar dacă nu avem una, ci multe linii de cod? În astfel de cazuri, operatorul săgeată nu va returna o valoare, deoarece există mai multe linii, nu una.

Poate putem folosi returnarea ? La urma urmei, este folosit pentru a returna valori în Java. Din păcate, nu, întoarcerea nu va funcționa cu un comutator. Deci, ce putem folosi? Înainte exista break , dar asta a fost eliminat în Java 13. Dar în locul lui avem acum randament — un nou cuvânt cheie care te ajută să returnezi o valoare de la un comutator. Este analog cu instrucțiunile returnate în metode.


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

Acest cod conține o singură linie, iar operatorul -> va returna „salut”.

Dar când avem un bloc de cod:


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

Cuvântul cheie care vă va ajuta să returnați o valoare este randament :


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

	}
};

yield a fost adăugat în Java 13 pentru cazurile în care avem mai mult de o linie de cod într-un bloc de caz și trebuie să returnăm un rezultat.

Probabil că sunteți dornic să încercați noul comutator din codul dvs., dar amintiți-vă că aveți nevoie de Java 14 sau o versiune superioară pentru a face acest lucru. Cu versiunile anterioare, acest comutator va fi disponibil numai dacă specificați indicatorul „--enable-preview” pe linia de comandă, deoarece înainte de versiunea 14 era parte din previzualizarea tehnică, nu o parte cu drepturi depline a limbajului.

Asta este tot pentru acum! Te văd!