1. Ausdrücke vs. Anweisungen
Alle Anweisungen in Java lassen sich in zwei Kategorien einteilen: Anweisungen (Statement) und Ausdrücke (Expression). Über eine Anweisung sagt man typischerweise, dass sie ausgeführt wird, über einen Ausdruck – dass er ausgewertet wird. Aber das ist nicht das Wichtigste.
Der Hauptunterschied zwischen Anweisung und Ausdruck besteht darin, dass ein Ausdruck ein Auswertungsergebnis hat. Dieses Ergebnis hat erstens einen Typ, und zweitens kann man es einer Variablen zuweisen oder in einem anderen Ausdruck verwenden.
Beispiele:
| Code | Hinweise |
|---|---|
|
Anweisung |
|
Ausdruck, Typ boolean |
|
Ausdruck, der Typ entspricht dem Typ der Variablen i |
|
Ausdruck, der Typ entspricht dem Typ der Variablen x |
Und was bringt uns das?
Erstens können wir den Umstand nutzen, dass sehr viele Anweisungen in Wirklichkeit Ausdrücke sind (ein Auswertungsergebnis liefern). Zum Beispiel funktioniert folgender Code:
int x, y, z;
x = y = z = 1; // x = (y = (z = 1));
Zweitens können wir das Ergebnis der Auswertung ignorieren, wenn wir möchten.
console.nextLine(); // Ergebnis der Eingabe ignorieren
Das Ignorieren des Auswertungsergebnisses ist z. B. dann nötig, wenn der Ausdruck neben dem Ergebnis noch etwas Nützliches bewirkt und uns diese Nebenwirkung wichtig ist, das Ergebnis aber nicht.
2. Der ternäre Operator
Dieser Lifehack ist schon interessanter als der vorherige. In Java gibt es einen speziellen ternären (dreifachen) Operator. Er ähnelt in gewisser Weise der Kurzschreibweise des Operators if–else:
condition ? expression1 : expression2;
Ist die Bedingung wahr, wird Ausdruck 1 ausgeführt, andernfalls wird Ausdruck 2 ausgeführt. Auf die Bedingung folgt ein Fragezeichen, die beiden Ausdrücke sind durch einen Doppelpunkt getrennt.
Der Hauptunterschied zwischen dem ternären Operator und dem Operator if-else besteht darin, dass der ternäre Operator ein Ausdruck ist – sein Ergebnis kann also einer Variablen zugewiesen werden.
Zum Beispiel möchten wir das Minimum zweier Zahlen berechnen. Mit dem ternären Operator sieht der Code so aus:
int a = 2;
int b = 3;
int min = a < b ? a : b;
Oder Sie möchten je nach Bedingung einer Variablen unterschiedliche Werte zuweisen. Wie lässt sich das umsetzen?
Variante eins — den Operator if-else verwenden:
int age = 25;
int money;
if (age > 30)
money = 100;
else
money = 50;
Variante zwei — den ternären Operator verwenden, also die Kurzschreibweise von if-else:
int age = 25;
int money = age > 30 ? 100 : 50;
Was sollte man also verwenden: den Operator if-else oder den ternären Operator? In puncto Ausführungsgeschwindigkeit gibt es keinen großen Unterschied. Es ist eher eine Frage der Lesbarkeit. Und das ist sehr wichtig: Code soll nicht nur korrekt funktionieren, sondern sich auch leicht von anderen Programmierern lesen lassen.
Ein einfaches Kriterium kann sein: Wenn der Code in eine Zeile passt — verwenden Sie den ternären Operator; passt er nicht in eine Zeile — verwenden Sie besser if-else.
3. Feinheiten in der Anwendung
Werttypen
Wichtig: Beide Zweige des ternären Operators (<Wert_wenn_wahr> und <Wert_wenn_falsch>) sollten vom gleichen Typ sein oder kompatibel (z. B. beide String oder beide int).
Funktioniert:
int a = 10, b = 20;
int max = (a > b) ? a : b; // beide Zweige — int
Kompilierfehler:
int a = 10, b = 20;
// String und int sind nicht kompatibel
String result = (a > b) ? "größer" : 0; // Kompilierfehler: int kann nicht einer Variablen vom Typ String zugewiesen werden
Korrekte Variante:
int a = 10, b = 20;
String result = (a > b) ? "größer" : "kleiner oder gleich";
Beispiel: Arbeit mit Zahlen
Berechnen wir den absoluten Wert mithilfe des ternären Operators:
int number = -5;
int abs = (number >= 0) ? number : -number;
System.out.println(abs); // 5
4. Einbettung des ternären Operators in eine Anwendung
Schreiben wir eine kleine Dialoganwendung: Neben der Begrüßung sagt das Programm dem Benutzer, wie alt er im nächsten Jahr sein wird, und gibt an, ob er volljährig sein wird.
System.out.print("Geben Sie Ihren Namen ein: ");
String name = console.nextLine();
System.out.print("Geben Sie Ihr Alter ein: ");
int age = console.nextInt();
int nextYear = age + 1;
String status = (nextYear >= 18) ? "volljährig" : "minderjährig";
System.out.println("Hallo, " + name + "! Im nächsten Jahr sind Sie " + nextYear + " Jahre alt. Sie werden " + status + " sein.");
Details erläutert:
Die Variable status wird mithilfe des ternären Operators berechnet: Wenn das Alter im nächsten Jahr mindestens 18 ist, ist der Benutzer volljährig (oder bleibt es).
5. Verschachtelte ternäre Operatoren — Vorsicht!
Man kann ternäre Operatoren ineinander verschachteln (in jedem Zweig kann noch ein weiterer Ternary stehen). Aber… davon bekommt man meist Kopfschmerzen, vor allem bei der Person, die den Code nach Ihnen liest (selbst wenn das Sie in 2 Tagen sind).
Beispiel: Alterskategorie bestimmen
String category = (age < 7) ? "Vorschulkind" :
(age < 18) ? "Schüler" :
(age < 65) ? "Erwachsener" : "Rentner";
Entscheidungstabelle:
| Alter | Bedingung | Ergebnis |
|---|---|---|
| < 7 | |
Vorschulkind |
| 7–17 | |
Schüler |
| 18–64 | |
Erwachsener |
| 65 und älter | sonst | Rentner |
Solchen Code kann man noch lesen, aber wenn die Logik komplexer wird — verwenden Sie besser if-else if-else.
6. Lifehack: der ternäre Operator und der Typ boolean
Manchmal möchte man einen Ausdruck dieser Art schreiben:
boolean adult = (age >= 18) ? true : false;
Das ist jedoch überflüssig. Der Ausdruck (age >= 18) liefert bereits boolean. Daher kann man ihn verkürzen auf:
boolean adult = (age >= 18);
GO TO FULL VERSION