Sealed Classes & Interfaces (Java 17+)
1Concept
Sealed classes restrict which other classes or interfaces may extend or implement them using `sealed` and `permits`. Permitted subclasses must be marked `final`, `sealed`, or `non-sealed`. This enables exhaustive pattern matching without defensive default cases.
2Architecture Diagram
sealed interface PaymentResult permits Success, Failure, Pending {}
|
+---> final class Success implements PaymentResult
+---> final class Failure implements PaymentResult
+---> final class Pending implements PaymentResult3Code Example
Core Java
public class SealedClassesDemo {
sealed interface Result permits Success, Error {}
record Success(String payload) implements Result {}
record Error(String message, int errorCode) implements Result {}
public static void handle(Result res) {
// Exhaustive switch: compiler knows all permitted subtypes!
String message = switch (res) {
case Success s -> "Success: " + s.payload();
case Error e -> "Error [" + e.errorCode() + "]: " + e.message();
};
System.out.println(message);
}
public static void main(String[] args) {
handle(new Success("Order dispatched"));
handle(new Error("Database timeout", 504));
}
}4Expected Output
Success: Order dispatched Error [504]: Database timeout
5Key Takeaways
- ✓Permitted subclasses must belong to the same module or package as the sealed class.
- ✓`non-sealed` allows breaking open the hierarchy for open extension by third parties.
- ✓Sealed classes enable exhaustive compiler verification in modern switch expressions.