Phase 20 of 20 · Topic 20.2

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 PaymentResult

3Code 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.