Switch Statements
Cunoști lanțurile de if-else. Funcționează grozav pentru 2-3 opțiuni. Dar când ai multe opțiuni (cum ar fi ce armă a ales Tommy), codul devine urât rapid. Aici intră în scenă switch
public class Main {
public static void main(String[] args) {
String arma = "shotgun";
switch (arma) {
case "pistol":
System.out.println("De baza dar de incredere");
break;
case "shotgun":
System.out.println("Devastator la distanta apropiata");
break;
case "rocket":
System.out.println("Exagerare totala");
break;
default:
System.out.println("Arma necunoscuta");
break;
}
}
}
Ieșire
Devastator la distanta apropiata
switch verifică valoarea lui arma și sare la case-ul care se potrivește. Când găsește "shotgun", rulează acel bloc, apoi break îi spune să se oprească și să iasă din switch
break este crucial. Fără el, Java „cade prin" (fall-through) la următorul case și continuă să ruleze
public class Main {
public static void main(String[] args) {
int stele = 3;
switch (stele) {
case 1:
System.out.println("Politia te observa");
case 2:
System.out.println("Politia te urmareste");
case 3:
System.out.println("Apare elicopterul");
case 4:
System.out.println("Sosesc fortele speciale");
case 5:
System.out.println("Intra tancurile armatei");
}
}
}
Ieșire
Apare elicopterul
Sosesc fortele speciale
Intra tancurile armatei
Uau, voiam doar mesajul de 3 stele, dar a afișat 3, 4 și 5! Asta pentru că fără break, Java cade prin fiecare case de sub potrivire. Uneori asta e util intenționat, dar de obicei e un bug. Adaugă întotdeauna break dacă nu vrei în mod special fall-through
Versiunea corectă cu break
public class Main {
public static void main(String[] args) {
int stele = 3;
switch (stele) {
case 3:
System.out.println("Apare elicopterul");
break;
case 4:
System.out.println("Sosesc fortele speciale");
break;
case 5:
System.out.println("Intra tancurile armatei");
break;
}
}
}
Ieșire
Apare elicopterul
default este ca else-ul dintr-un lanț de if-else: se ocupă de orice nu se potrivește cu niciun case
public class Main {
public static void main(String[] args) {
String vehicul = "barca";
switch (vehicul) {
case "masina":
System.out.println("Condu pe drumuri");
break;
case "bicicleta":
System.out.println("Strecoara-te prin trafic");
break;
default:
System.out.println("Alt vehicul: " + vehicul);
break;
}
}
}
Ieșire
Alt vehicul: barca
switch funcționează cu int, String, char și enum. Uneori vrem ca mai multe case-uri să ruleze același cod. Atunci le stivuim unul peste altul, fără cod între ele
public class Main {
public static void main(String[] args) {
String zi = "Luni";
switch (zi) {
case "Sambata":
case "Duminica":
System.out.println("Weekend");
break;
default:
System.out.println("Zi lucratoare");
break;
}
}
}
Observă cum am stivuit case "Sambata": și case "Duminica": împreună, fără cod între ele: acela este fall-through intenționat. Ambele case-uri rulează același cod. Aceasta este singura dată când fall-through chiar e la îndemână
Switch cu int este de asemenea foarte des întâlnit
public class Main {
public static void main(String[] args) {
int optiuneMeniu = 2;
switch (optiuneMeniu) {
case 1:
System.out.println("Incepe joc nou");
break;
case 2:
System.out.println("Incarca jocul salvat");
break;
case 3:
System.out.println("Setari");
break;
default:
System.out.println("Alegere invalida");
break;
}
}
}
Ieșire
Incarca jocul salvat
Misiune: Clasificatorul Programului de Tură
Programul de tură al stației are nevoie de un clasificator rapid: dată fiind o zi, afișează dacă este o tură de zi lucrătoare sau de weekend.
Reține ziua într-o variabilă String numită zi și scrie un switch care:
- pentru
"Luni","Marti","Miercuri","Joi","Vineri"→ afișeazăZi lucratoare - pentru
"Sambata"și"Duminica"→ afișeazăWeekend - în orice alt caz → afișează
Zi necunoscuta
Exemple
Pentru "Luni":
Zi lucratoare
Pentru "Sambata":
Weekend
Pentru "Craciun" (nu e o zi a săptămânii):
Zi necunoscuta