Code
// Sealed classpublic sealed class Shape permits Circle, Rectangle, Triangle { public abstract double area();}// Final subclass (cannot be extended)public final class Circle extends Shape { private final double radius; public Circle(double radius) { this.radius = radius; } @Override public double area() { return Math.PI * radius * radius; }}// Final subclasspublic final class Rectangle extends Shape { private final double width, height; public Rectangle(double width, double height) { this.width = width; this.height = height; } @Override public double area() { return width * height; }}// Non-sealed subclass (can be extended)public non-sealed class Triangle extends Shape { protected double base, height; public Triangle(double base, double height) { this.base = base; this.height = height; } @Override public double area() { return 0.5 * base * height; }}// Can extend non-sealed classpublic class EquilateralTriangle extends Triangle { private double side; public EquilateralTriangle(double side) { super(side, side * Math.sqrt(3) / 2); this.side = side; }}// Sealed interfacepublic sealed interface Expression permits Constant, Variable, Addition, Multiplication { double evaluate();}public final class Constant implements Expression { private final double value; public Constant(double value) { this.value = value; } @Override public double evaluate() { return value; }}public final class Variable implements Expression { private final String name; private final double value; public Variable(String name, double value) { this.name = name; this.value = value; } @Override public double evaluate() { return value; }}public record Addition(Expression left, Expression right) implements Expression { @Override public double evaluate() { return left.evaluate() + right.evaluate(); }}public record Multiplication(Expression left, Expression right) implements Expression { @Override public double evaluate() { return left.evaluate() * right.evaluate(); }}// Create instancesShape circle = new Circle(5.0);Shape rectangle = new Rectangle(4.0, 6.0);Shape triangle = new Triangle(3.0, 4.0);// Pattern matching with instanceof (Java 16+)public static double calculateArea(Shape shape) { if (shape instanceof Circle c) { return c.area(); } else if (shape instanceof Rectangle r) { return r.area(); } else if (shape instanceof Triangle t) { return t.area(); } // Compiler knows all cases are covered return 0;}// Switch expressions with pattern matching (Java 17+)public static String describe(Shape shape) { return switch (shape) { case Circle c -> "Circle with radius " + c.radius; case Rectangle r -> "Rectangle with dimensions " + r.width + "x" + r.height; case Triangle t -> "Triangle with base " + t.base + " and height " + t.height; // Compiler ensures exhaustiveness };}// Expression evaluationExpression expr1 = new Constant(5.0);Expression expr2 = new Variable("x", 3.0);Expression expr3 = new Addition(expr1, expr2);Expression expr4 = new Multiplication(expr3, new Constant(2.0));double result = expr4.evaluate(); // (5 + 3) * 2 = 16// Pattern matching on expressionspublic static String format(Expression expr) { return switch (expr) { case Constant c -> String.valueOf(c.value()); case Variable v -> v.name(); case Addition a -> "(" + format(a.left()) + " + " + format(a.right()) + ")"; case Multiplication m -> "(" + format(m.left()) + " * " + format(m.right()) + ")"; };}
Comments
No comments yet. Be the first!
Please login to leave a comment.