Working with Sealed Classes (Java 17+)

1. Declaring Sealed Classes

Example: Sealed hierarchy

public sealed class Shape permits Circle, Square, Triangle {}
public final class Circle extends Shape {}
public final class Square extends Shape {}
public non-sealed class Triangle extends Shape {}
ModifierEffect
sealedRestricts subclasses to permits list
finalSubclass cannot be extended
sealed (subclass)Continue restricted hierarchy
non-sealedOpen subclass back up

2. Using permits Clause

RuleDetail
Same module/packagePermitted classes must be accessible
Direct subtypes onlyListed classes must directly extend/implement
OptionalCan omit if all permitted are in same file

3. Creating Permitted Subclasses

Subclass ModifierRequired
finalCloses hierarchy at this leaf
sealedContinue with own permits
non-sealedAllow unrestricted subclassing

4. Understanding Sealed Interfaces

Example: Sealed interface

public sealed interface Result<T> permits Success, Failure {}
public record Success<T>(T value) implements Result<T> {}
public record Failure<T>(String error) implements Result<T> {}
AspectDetail
ImplementorsRestricted via permits
Common patternSealed interface + record subtypes (algebraic data types)

5. Combining Sealed Classes with Pattern Matching

Example: Exhaustive switch

String describe(Result<Integer> r) {
    return switch (r) {
        case Success<Integer> s -> "OK: " + s.value();
        case Failure<Integer> f -> "Error: " + f.error();
    };  // no default needed — exhaustive
}
BenefitDetail
No defaultCompiler verifies all cases covered
Refactor-safeAdding new permitted type causes compile error

6. Understanding Exhaustiveness Checking

TriggerBehavior
Switch on sealed typeCompiler verifies all permitted subtypes covered
Missing caseCompile error
Add subtype laterAll switches re-checked

7. Using Sealed Classes for Domain Modeling

PatternUse Case
Result/EitherSuccess vs Failure
AST nodesExpression types
State machineFinite states
Event typesEvent sourcing

8. Comparing Sealed Classes vs Final Classes

AspectSealedFinal
SubclassingAllowed (restricted)None
Pattern matchingExhaustive checks supportedN/A
Closed type setYes (known at compile)Single class