Return to site

🤹‍♂️🔢 PRIMITIVES IN SWITCH & PATTERN MATCHING (JAVA 26 PREVIEW)

· java

🔸 TLDR

▪️ JEP 530 makes pattern matching feel “complete” by bringing primitives into patterns, instanceof, and switch — with safety against lossy conversions.

Section image

🔸 CONTEXT

Java’s pattern matching story keeps getting more uniform… and JEP 530 (4th preview) is a big step: it lets you use primitive types in patterns, instanceof, and switch — including boolean, long, float, double.

🔸 WHAT JEP 530 UNLOCKS

▪️ Use primitive type patterns directly in switch cases

▪️ Use instanceof as a safe-cast guard for primitives (no more hand-written range checks)

▪️ Switch on all primitive types, not just byte/short/char/int

🔸 THE “AHA” EXAMPLE: SWITCH WITH PRIMITIVE PATTERNS

int status = x.getStatus();

String label = switch (status) {
  case 0 -> "okay";
  case 1 -> "warning";
  case 2 -> "error";
  case int i -> "unknown status: " + i; // captures the value
};

▪️ That last case int i is super handy for logging, metrics, and “unknown value” handling.

🔸 GUARDS + PRIMITIVES (MORE EXPRESSIVE BRANCHING)

int flights = x.getYearlyFlights();

var action = switch (flights) {
  case 0 -> "none";
  case 1, 2 -> "discount";
  case int i when i >= 100 -> "gold";
  case int i -> "standard (" + i + ")";
};

▪️ You keep the readability of switch, plus the precision of guards.

🔸 THE REAL WIN: SAFE CASTING WITH PRIMITIVE instanceof

Instead of writing range checks forever… 😅

int i = 1000;

if (i instanceof byte b) {
  // only enters if conversion is exact (no loss)
  sendAsByte(b);
} else {
  handleOutOfRange(i);
}

▪️ The pattern matches only if the conversion is exact, so you avoid subtle “silent truncation” bugs.

🔸 SWITCH ON boolean & long (YES, REALLY)

boolean loggedIn = user.isLoggedIn();

long v = getId();

var id = switch (loggedIn) {
  case true  -> user.id();
  case false -> { log("Unrecognized user"); yield -1L; }
};

var label2 = switch (v) {
  case 1L -> "one";
  case 10_000_000_000L -> "big";
  case long x -> "other: " + x;
};

▪️ boolean switch can be a nicer alternative to ternary when you need blocks + logging.

🔸 WHAT CHANGED IN THE 4TH PREVIEW

▪️ Better definition of “unconditional exactness”

▪️ Tighter dominance checks in switch → more compile-time errors caught earlier (some old switches may stop compiling)

🔸 HOW TO TRY IT (PREVIEW FEATURE)

javac --release 26 --enable-preview Main.java
java --enable-preview Main

▪️ Preview features are off by default — you must enable them at compile + runtime.

🔸 TAKEAWAYS

▪️ Less boilerplate: fewer default hacks and manual casts ✂️

▪️ Safer code: conversions match only when exact 🛡️

▪️ More expressive switch: guards + captured primitives = cleaner branching 🧠

▪️ Remember: it’s Java 26 preview → expect potential tweaks before final ✅

💬 Would you use instanceof byte b / switch (boolean) in production once it’s finalized — or does it feel “too clever”? 👀

#Java #OpenJDK OpenJDK #JDK26 #JEP530 #PatternMatching #SwitchExpression #CleanCode #SoftwareEngineering #DeveloperExperience #TypeSafety #ProgrammingLanguages

Go further with Java certification:

Java👇

Spring👇

SpringBook👇

JavaBook👇