From d466c8b4543032c1b04acd6895c49ee8bec57375 Mon Sep 17 00:00:00 2001 From: AbhineshJha Date: Mon, 27 Oct 2025 18:55:49 +0530 Subject: [PATCH] Add demo for JEP 361 - Switch Expressions with JEP 325 and 354 linking classes --- .../org/javademos/init/Java12DemoLoader.java | 3 + .../org/javademos/init/Java13DemoLoader.java | 11 +- .../org/javademos/init/Java14DemoLoader.java | 6 +- .../jep325/SwitchExpressionsPreview.java | 21 ++ .../SwitchExpressionsSecondPreview.java | 21 ++ .../java14/jep361/SwitchExpressionsDemo.java | 182 ++++++++++++++++++ src/main/resources/JDK12Info.json | 8 + src/main/resources/JDK13Info.json | 10 + src/main/resources/JDK14Info.json | 8 + 9 files changed, 262 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/javademos/java12/jep325/SwitchExpressionsPreview.java create mode 100644 src/main/java/org/javademos/java13/jep354/SwitchExpressionsSecondPreview.java create mode 100644 src/main/java/org/javademos/java14/jep361/SwitchExpressionsDemo.java create mode 100644 src/main/resources/JDK13Info.json diff --git a/src/main/java/org/javademos/init/Java12DemoLoader.java b/src/main/java/org/javademos/init/Java12DemoLoader.java index 29c8ff59..a3c59e28 100644 --- a/src/main/java/org/javademos/init/Java12DemoLoader.java +++ b/src/main/java/org/javademos/init/Java12DemoLoader.java @@ -4,6 +4,7 @@ import org.javademos.commons.IDemo; import org.javademos.commons.IDemoLoader; +import org.javademos.java12.jep325.SwitchExpressionsPreview; import org.javademos.java12.jep334.ConstantsAPIDemo; /** @@ -13,6 +14,8 @@ public class Java12DemoLoader implements IDemoLoader { @Override public void loadDemos(Map demos) { + // JEP 325 + demos.put(325, new SwitchExpressionsPreview()); // JEP 334 demos.put(334, new ConstantsAPIDemo()); } diff --git a/src/main/java/org/javademos/init/Java13DemoLoader.java b/src/main/java/org/javademos/init/Java13DemoLoader.java index 6a755028..babe0cbf 100644 --- a/src/main/java/org/javademos/init/Java13DemoLoader.java +++ b/src/main/java/org/javademos/init/Java13DemoLoader.java @@ -1,10 +1,10 @@ package org.javademos.init; +import java.util.Map; + import org.javademos.commons.IDemo; import org.javademos.commons.IDemoLoader; -import org.javademos.java14.jep370.ForeignMemoryAccessDemo; - -import java.util.Map; +import org.javademos.java13.jep354.SwitchExpressionsSecondPreview; /** * Loads demos for Java 13. @@ -13,8 +13,7 @@ public class Java13DemoLoader implements IDemoLoader { @Override public void loadDemos(Map demos) { - //TODO add demos for java 13 - - //demos.put(123, new FutureDemo()); + // JEP 354 + demos.put(354, new SwitchExpressionsSecondPreview()); } } diff --git a/src/main/java/org/javademos/init/Java14DemoLoader.java b/src/main/java/org/javademos/init/Java14DemoLoader.java index 5b893e84..731e96e8 100644 --- a/src/main/java/org/javademos/init/Java14DemoLoader.java +++ b/src/main/java/org/javademos/init/Java14DemoLoader.java @@ -1,13 +1,14 @@ package org.javademos.init; +import java.util.Map; + import org.javademos.commons.IDemo; import org.javademos.commons.IDemoLoader; import org.javademos.java14.jep305.InstanceofPatternMatchingPreview; import org.javademos.java14.jep359.RecordsPreviewDemo; +import org.javademos.java14.jep361.SwitchExpressionsDemo; import org.javademos.java14.jep370.ForeignMemoryAccessDemo; -import java.util.Map; - /** * Loads demos for Java 14. */ @@ -17,6 +18,7 @@ public class Java14DemoLoader implements IDemoLoader { public void loadDemos(Map demos) { demos.put(305, new InstanceofPatternMatchingPreview()); demos.put(359, new RecordsPreviewDemo()); + demos.put(361, new SwitchExpressionsDemo()); demos.put(370, new ForeignMemoryAccessDemo()); } } diff --git a/src/main/java/org/javademos/java12/jep325/SwitchExpressionsPreview.java b/src/main/java/org/javademos/java12/jep325/SwitchExpressionsPreview.java new file mode 100644 index 00000000..d4fd1b6d --- /dev/null +++ b/src/main/java/org/javademos/java12/jep325/SwitchExpressionsPreview.java @@ -0,0 +1,21 @@ +package org.javademos.java12.jep325; + +import org.javademos.commons.IDemo; + +/// Demo for JDK 12 feature JEP 325 - Switch Expressions (Preview). +/// +/// This was the first preview of switch expressions, introducing the arrow label syntax +/// and the ability to use switch as an expression. In this preview, values were returned +/// using `break `, which was later changed to `yield ` in JEP 354. +/// +/// The feature was finalized in JDK 14 by JEP 361. +/// @see org.javademos.java13.jep354.SwitchExpressionsSecondPreview +/// @see org.javademos.java14.jep361.SwitchExpressionsDemo +/// +/// @author Abhineshhh +public class SwitchExpressionsPreview implements IDemo { + @Override + public void demo() { + info(325); + } +} diff --git a/src/main/java/org/javademos/java13/jep354/SwitchExpressionsSecondPreview.java b/src/main/java/org/javademos/java13/jep354/SwitchExpressionsSecondPreview.java new file mode 100644 index 00000000..56cc2ca3 --- /dev/null +++ b/src/main/java/org/javademos/java13/jep354/SwitchExpressionsSecondPreview.java @@ -0,0 +1,21 @@ +package org.javademos.java13.jep354; + +import org.javademos.commons.IDemo; + +/// Demo for JDK 13 feature JEP 354 - Switch Expressions (Second Preview). +/// +/// This was the second preview of switch expressions. The main change from JEP 325 +/// was replacing the `break` statement with the new `yield` statement for returning +/// values from switch expressions. +/// +/// The feature was finalized in JDK 14 by JEP 361. +/// @see org.javademos.java12.jep325.SwitchExpressionsPreview +/// @see org.javademos.java14.jep361.SwitchExpressionsDemo +/// +/// @author Abhineshhh +public class SwitchExpressionsSecondPreview implements IDemo { + @Override + public void demo() { + info(354); + } +} diff --git a/src/main/java/org/javademos/java14/jep361/SwitchExpressionsDemo.java b/src/main/java/org/javademos/java14/jep361/SwitchExpressionsDemo.java new file mode 100644 index 00000000..1dc00ee5 --- /dev/null +++ b/src/main/java/org/javademos/java14/jep361/SwitchExpressionsDemo.java @@ -0,0 +1,182 @@ +package org.javademos.java14.jep361; + +import org.javademos.commons.IDemo; + +/// Demo for JDK 14 feature JEP 361 - Switch Expressions. +/// +/// Switch expressions extend switch to be used as either a statement or an expression, +/// with both traditional "case ... :" and new "case ... ->" labels. +/// This was a preview feature in JDK 12 (JEP 325) and JDK 13 (JEP 354), and became final in JDK 14. +/// +/// Key features demonstrated: +/// - Arrow labels (case ... ->) +/// - Switch expressions (assign values directly) +/// - Yield statement for complex blocks +/// - Exhaustiveness checking +/// - Multiple constants per case +/// +/// @see org.javademos.java12.jep325.SwitchExpressionsPreview +/// @see org.javademos.java13.jep354.SwitchExpressionsSecondPreview +/// @author Abhineshhh +public class SwitchExpressionsDemo implements IDemo { + + @Override + public void demo() { + info(361); + + System.out.println("=== Traditional Switch vs Arrow Labels ==="); + demonstrateArrowLabels(); + + System.out.println("\n=== Switch as Expression ==="); + demonstrateSwitchExpression(); + + System.out.println("\n=== Yield Statement ==="); + demonstrateYieldStatement(); + + System.out.println("\n=== Multiple Constants per Case ==="); + demonstrateMultipleConstants(); + + System.out.println("\n=== Exhaustiveness with Enums ==="); + demonstrateExhaustiveness(); + } + + /// Demonstrates arrow labels without fall-through + private void demonstrateArrowLabels() { + int day = 3; + + // Traditional switch (verbose with break statements) + System.out.println("Traditional switch:"); + switch (day) { + case 1: + case 2: + case 3: + System.out.println(" Beginning of the week"); + break; + case 4: + case 5: + System.out.println(" Middle of the week"); + break; + case 6: + case 7: + System.out.println(" Weekend"); + break; + default: + System.out.println(" Invalid day"); + break; + } + + // Arrow labels (concise, no fall-through) + System.out.println("Arrow label switch:"); + switch (day) { + case 1, 2, 3 -> System.out.println(" Beginning of the week"); + case 4, 5 -> System.out.println(" Middle of the week"); + case 6, 7 -> System.out.println(" Weekend"); + default -> System.out.println(" Invalid day"); + } + } + + /// Demonstrates switch as an expression + private void demonstrateSwitchExpression() { + Day day = Day.WEDNESDAY; + + // Old way: using a variable and assigning in each case + int numLettersOld; + switch (day) { + case MONDAY: + case FRIDAY: + case SUNDAY: + numLettersOld = 6; + break; + case TUESDAY: + numLettersOld = 7; + break; + case THURSDAY: + case SATURDAY: + numLettersOld = 8; + break; + case WEDNESDAY: + numLettersOld = 9; + break; + default: + throw new IllegalStateException("Unknown day: " + day); + } + System.out.println("Old way - " + day + " has " + numLettersOld + " letters"); + + // New way: switch expression directly assigns value + int numLetters = switch (day) { + case MONDAY, FRIDAY, SUNDAY -> 6; + case TUESDAY -> 7; + case THURSDAY, SATURDAY -> 8; + case WEDNESDAY -> 9; + }; + System.out.println("New way - " + day + " has " + numLetters + " letters"); + } + + /// Demonstrates yield statement for complex logic in switch expressions + private void demonstrateYieldStatement() { + Day day = Day.FRIDAY; + + String feeling = switch (day) { + case MONDAY -> "Terrible"; + case TUESDAY, WEDNESDAY, THURSDAY -> "Neutral"; + case FRIDAY -> { + String temp = "Great"; + yield temp + "!!! It's Friday!"; + } + case SATURDAY, SUNDAY -> { + // Complex logic requiring a block + int mood = calculateWeekendMood(); + String result = mood > 5 ? "Awesome" : "Good"; + yield result; + } + }; + + System.out.println("On " + day + ", feeling: " + feeling); + } + + /// Demonstrates multiple constants per case + private void demonstrateMultipleConstants() { + String month = "July"; + + int days = switch (month) { + case "January", "March", "May", "July", "August", "October", "December" -> 31; + case "April", "June", "September", "November" -> 30; + case "February" -> 28; // ignoring leap years for simplicity + default -> throw new IllegalArgumentException("Invalid month: " + month); + }; + + System.out.println(month + " has " + days + " days"); + } + + /// Demonstrates exhaustiveness checking with enums + private void demonstrateExhaustiveness() { + Day day = Day.SATURDAY; + + // Switch expression on enum must be exhaustive + // No default needed if all enum constants are covered + boolean isWeekend = switch (day) { + case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> false; + case SATURDAY, SUNDAY -> true; + }; + + System.out.println(day + " is weekend: " + isWeekend); + + // Alternative with default for future enum additions + String dayType = switch (day) { + case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "Weekday"; + case SATURDAY, SUNDAY -> "Weekend"; + // default added by compiler for safety + }; + + System.out.println(day + " is a " + dayType); + } + + private int calculateWeekendMood() { + return 8; // Always high on weekends! + } + + /// Enum for demonstrating switch with enums + private enum Day { + MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY + } +} diff --git a/src/main/resources/JDK12Info.json b/src/main/resources/JDK12Info.json index 7f1bb216..ffa1e0a6 100644 --- a/src/main/resources/JDK12Info.json +++ b/src/main/resources/JDK12Info.json @@ -1,4 +1,12 @@ [ + { + "jep": 325, + "jdk": 12, + "name": "JEP 325 - Switch Expressions (Preview)", + "dscr": "First preview of switch expressions. Finalized in JEP 361 (JDK 14).", + "link": true, + "code": false + }, { "jep": 334, "jdk": 12, diff --git a/src/main/resources/JDK13Info.json b/src/main/resources/JDK13Info.json new file mode 100644 index 00000000..aaf4a842 --- /dev/null +++ b/src/main/resources/JDK13Info.json @@ -0,0 +1,10 @@ +[ + { + "jep": 354, + "jdk": 13, + "name": "JEP 354 - Switch Expressions (Second Preview)", + "dscr": "Second preview of switch expressions introducing yield statement. Finalized in JEP 361 (JDK 14).", + "link": true, + "code": false + } +] diff --git a/src/main/resources/JDK14Info.json b/src/main/resources/JDK14Info.json index c35247ce..d0ef0e39 100644 --- a/src/main/resources/JDK14Info.json +++ b/src/main/resources/JDK14Info.json @@ -15,6 +15,14 @@ "link": true, "code": false }, + { + "jep": 361, + "jdk": 14, + "name": "JEP 361 - Switch Expressions", + "dscr": "Extend switch to be used as either a statement or an expression, with arrow labels and yield statement", + "link": false, + "code": true + }, { "jep": 370, "jdk": 14,