if, else if, else
public class Note {
public static void main(String[] args) {
int punkte = 73;
if (punkte >= 90) {
System.out.println("sehr gut");
} else if (punkte >= 75) {
System.out.println("gut");
} else if (punkte >= 50) {
System.out.println("bestanden");
} else {
System.out.println("nicht bestanden");
}
}
}bestanden
Die Bedingung muss ein boolean sein (anders als in C oder JavaScript gibt es kein "truthy"). Setze immer geschweifte Klammern.
switch (klassisch)
public class Wochentag {
public static void main(String[] args) {
int tag = 6;
switch (tag) {
case 1:
System.out.println("Montag");
break;
case 6:
case 7:
System.out.println("Wochenende");
break;
default:
System.out.println("Werktag");
}
}
}Wochenende
Ohne break läuft der Code in den nächsten Fall weiter (Fall-through).
switch-Ausdruck (modern)
Seit Java 14 gibt es die kompakte Form mit ->. Sie hat kein Fall-through, liefert einen Wert und muss vollständig sein:
public class Modern {
enum Farbe { ROT, GELB, GRUEN }
public static void main(String[] args) {
int tag = 3;
String name = switch (tag) {
case 1 -> "Montag";
case 2 -> "Dienstag";
case 3 -> "Mittwoch";
case 6, 7 -> "Wochenende";
default -> "anderer Tag";
};
System.out.println(name);
Farbe f = Farbe.GELB;
int dauer = switch (f) {
case ROT -> 30;
case GELB -> {
int zwischen = 3;
yield zwischen * 2; // bei Blöcken: yield liefert den Wert
}
case GRUEN -> 20;
};
System.out.println(dauer);
String text = "ja";
boolean ok = switch (text) {
case "ja", "yes", "ok" -> true;
default -> false;
};
System.out.println(ok);
}
}Mittwoch 6 true
Bei enum und sealed-Typen prüft der Compiler, dass alle Fälle behandelt sind.
Pattern Matching im switch
public class Muster {
record Kreis(double r) {}
record Rechteck(double b, double h) {}
static double flaeche(Object form) {
return switch (form) {
case Kreis k -> Math.PI * k.r() * k.r();
case Rechteck(double b, double h) -> b * h; // Record-Pattern: gleich zerlegen
case null -> 0;
default -> throw new IllegalArgumentException("Unbekannt: " + form);
};
}
public static void main(String[] args) {
System.out.printf("%.2f %.1f%n", flaeche(new Kreis(1)), flaeche(new Rechteck(3, 4)));
}
}3.14 12.0
Verschachtelte Bedingungen vermeiden
public class Frueh {
static String preis(int alter) {
if (alter < 0) return "ungültig";
if (alter < 6) return "frei";
if (alter < 18) return "5 EUR";
return "10 EUR";
}
public static void main(String[] args) {
System.out.println(preis(-1) + " " + preis(4) + " " + preis(12) + " " + preis(40));
}
}ung?ltig frei 5 EUR 10 EUR
Frühes return hält den Code flach und gut lesbar.
Merke
if-Bedingungen müssenbooleansein; immer{ }setzen- Klassisches
switchbrauchtbreak; der moderne Ausdruck mit->nicht switchkann einen Wert liefern, mityieldin Blöcken- Pattern Matching zerlegt Typen und Records direkt im
switch - Früh zurückgeben statt tief verschachteln
Aufgabe
Schreibe eine Methode monatsTage(int monat, boolean schaltjahr) mit einem switch-Ausdruck.