// Created on savesnippets.com · https://savesnippets.com/tXl28rgvhODCjq public sealed interface Shape permits Circle, Square, Rectangle {} public record Circle(double radius) implements Shape {} public record Square(double side) implements Shape {} public record Rectangle(double w, double h) implements Shape {} // The compiler verifies every variant is handled — no `default` needed. public static double area(Shape s) { return switch (s) { case Circle c -> Math.PI * c.radius() * c.radius(); case Square sq -> sq.side() * sq.side(); case Rectangle r -> r.w() * r.h(); }; } // With pattern variables + record deconstruction public static String describe(Shape s) { return switch (s) { case Circle(double r) when r > 100 -> "huge circle"; case Circle(double r) -> "circle r=" + r; case Square(double side) -> "square " + side; case Rectangle(double w, double h) -> w == h ? "actually a square" : "rect"; }; }