Hoofdstuk 7 — Controlestructuren (if, else, switch) voor beslissingen
Beslissingen vormen de kern van logica in je programma. Met if/else toets je voorwaarden; met switch kies je uit meerdere takken. In moderne Java (21) kun je switch ook als expressie gebruiken die een waarde oplevert.
Voorbeeld 1 — Basis if/else Introductie: Eenvoudige keuze tussen twee paden op basis van een voorwaarde.
public class IfElseBasis {
public static void main(String[] args) {
int score = 75;
if (score >= 60) {
System.out.println("Geslaagd");
} else {
System.out.println("Gezakt");
}
}
}
Toelichting: Gebruik if/else wanneer er twee mogelijke uitkomsten zijn.
Voorbeeld 2 — Meerdere if/else-if takken Introductie: Kies uit meer dan twee categorieën met else-if ketens.
public class CijferBeoordeling {
public static void main(String[] args) {
int score = 83;
if (score >= 90) {
System.out.println("Uitmuntend");
} else if (score >= 75) {
System.out.println("Goed");
} else if (score >= 60) {
System.out.println("Voldoende");
} else {
System.out.println("Onvoldoende");
}
}
}
Toelichting: Houd de voorwaarden eenvoudig; bij lange ketens kan een switch of mapping duidelijker zijn.
Voorbeeld 3 — Ingesloten if (nested) en leesbaarheid Introductie: Geneste if’s kunnen logica uitdrukken, maar kunnen snel onleesbaar worden.
public class NestedIf {
public static void main(String[] args) {
int leeftijd = 20;
boolean lid = true;
if (leeftijd >= 18) {
if (lid) {
System.out.println("Volwassen lid");
} else {
System.out.println("Volwassen geen lid");
}
} else {
System.out.println("Minderjarig");
}
}
}
Toelichting: Overweeg vroege returns of hulpmethoden om diepe nesting te vermijden.
Voorbeeld 4 — Switch (statement) met pijl-syntaxis Introductie: Gebruik switch voor vaste, op één variabele gebaseerde keuzes.
public class SwitchStatementDemo {
public static void main(String[] args) {
int dag = 3;
switch (dag) {
case 1 -> System.out.println("Maandag");
case 2 -> System.out.println("Dinsdag");
case 3 -> System.out.println("Woensdag");
case 4 -> System.out.println("Donderdag");
case 5 -> System.out.println("Vrijdag");
case 6, 7 -> System.out.println("Weekend");
default -> System.out.println("Onbekend");
}
}
}
Toelichting: De pijl-syntaxis is kort en voorkomt fall‑through.
Voorbeeld 5 — Switch als expressie met returnwaarde Introductie: Switch kan ook een waarde opleveren die je direct kunt toewijzen.
public class SwitchExpressieDemo {
public static void main(String[] args) {
int maand = 2;
int dagen = switch (maand) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> 28; // schrikkeljaren laten we hier buiten beschouwing
default -> throw new IllegalArgumentException("Onbekende maand: " + maand);
};
System.out.println("Dagen: " + dagen);
}
}
Toelichting: De default-tak is verplicht voor volledigheid; of gooi een betekenisvolle exception.
Voorbeeld 6 — yield in switch-blokken
Introductie: Gebruik yield om vanuit een blok een waarde terug te geven.
public class SwitchYieldDemo {
public static void main(String[] args) {
String rol = "admin";
int niveau = switch (rol) {
case "gast" -> 0;
case "gebruiker" -> 1;
case "admin" -> {
System.out.println("Extra checks...");
yield 2; // geef waarde terug vanuit blok
}
default -> -1;
};
System.out.println(niveau);
}
}
Toelichting: Binnen blokken kun je extra statements uitvoeren voordat je een waarde ‘yields’.
Voorbeeld 7 — Valstrik: toekennings- vs vergelijkingsoperator
Introductie: Een veelgemaakte fout is = (toekennen) gebruiken i.p.v. == (vergelijken).
public class AssignVsEquals {
public static void main(String[] args) {
boolean vlag = false;
// if (vlag = true) { ... } // fout: dit is toekenning
if (vlag == true) {
System.out.println("waar");
} else {
System.out.println("niet waar");
}
}
}
Toelichting: De compiler zou deze fout soms niet waarschuwen zonder @SuppressWarnings; voorkom het door == te gebruiken.
Voorbeeld 8 — Guard clauses (vroeg terugkeren) Introductie: Met guard clauses keer je vroeg terug en hou je methoden plat en leesbaar.
public class GuardClauses {
static String beschrijf(int n) {
if (n < 0) return "negatief";
if (n == 0) return "nul";
return "positief";
}
public static void main(String[] args) {
System.out.println(beschrijf(-5));
System.out.println(beschrijf(0));
System.out.println(beschrijf(7));
}
}
Toelichting: Minder nesting en duidelijke ‘speciale gevallen’ verbeteren de leesbaarheid.
Voorbeeld 9 — Combineren met logische operatoren Introductie: Combineer voorwaarden met EN (&&) en OF (||) voor expressieve checks.
public class Combinaties {
public static void main(String[] args) {
int leeftijd = 19;
boolean toestemmingOuder = true;
if (leeftijd >= 18 || toestemmingOuder) {
System.out.println("toestaan");
}
if (leeftijd >= 18 && toestemmingOuder) {
System.out.println("speciaal tarief");
}
}
}
Toelichting: Gebruik || voor alternatieve toegang en && voor samenlopende eisen.
Tips:
- Gebruik
switchwanneer je op één variabele meerdere vaste gevallen afhandelt. - Gebruik
if/elsebij complexe of samengestelde voorwaarden. - Schrijf compacte, leesbare voorwaarden; overweeg hulp-methoden voor duidelijkheid.
Koppeling met oefeningen:
- Zie
java-workbook/src/chapter_7.mdvoor opdrachten met if/else en switch-expressies. - Uitwerkingen in
java-solutions/src/chapter_7.md.