Code
java
// Sealed class
public sealed abstract class Shape
permits Circle, Square, Triangle {}
public final class Circle extends Shape {
private final double radius;
public Circle(double r) { radius = r; }
}
public final class Square extends Shape {
private final double side;
public Square(double s) { side = s; }
}
public final class Triangle extends Shape {
private final double base, height;
public Triangle(double b, double h) { base = b; height = h; }
}
// Exhaustive matching
double area(Shape shape) {
return switch (shape) {
case Circle c -> Math.PI * c.radius * c.radius;
case Square s -> s.side * s.side;
case Triangle t -> 0.5 * t.base * t.height;
};
}