The sealed
keyword in Java is used to restrict which classes or interfaces can extend or implement a given class or interface. This feature, introduced in Java 17, allows developers to define a more controlled and predictable class hierarchy. A sealed
class or interface specifies a list of permitted subclasses or implementors, providing more fine-grained control over inheritance.
Table of Contents
- Introduction
sealed
Keyword Syntax- Understanding
sealed
- Examples
- Sealed Class
- Sealed Interface
- Permitting Classes
- Real-World Use Case
- Conclusion
Introduction
In Java, the sealed
keyword allows you to declare a class or interface as sealed
, meaning only specified subclasses or implementors can extend or implement it. This helps in creating a more controlled inheritance hierarchy and can be useful for maintaining security and predictability in your application’s design.
sealed Keyword Syntax
The syntax for declaring a sealed class or interface is as follows:
public sealed class ClassName permits Subclass1, Subclass2 { // class body } public sealed interface InterfaceName permits Implementor1, Implementor2 { // interface body }
Example:
public sealed class Shape permits Circle, Rectangle, Square { // class body }
Understanding sealed
Key Points:
- Controlled Inheritance: The
sealed
keyword restricts which classes can extend or implement a class or interface. - Permits Clause: The
permits
clause specifies the allowed subclasses or implementors. - Subclasses: The subclasses must either be
final
,sealed
, ornon-sealed
.
Types of Subclasses:
- final: No further subclassing is allowed.
- sealed: Further subclassing is restricted to specific classes.
- non-sealed: The class can be subclassed without restrictions.
Examples
Sealed Class
A sealed class with permitted subclasses.
Example
// File: Shape.java public sealed class Shape permits Circle, Rectangle, Square { // common properties and methods } // File: Circle.java public final class Circle extends Shape { // properties and methods specific to Circle } // File: Rectangle.java public sealed class Rectangle extends Shape permits Square { // properties and methods specific to Rectangle } // File: Square.java public final class Square extends Rectangle { // properties and methods specific to Square }
Sealed Interface
A sealed interface with permitted implementors.
Example
// File: Operation.java public sealed interface Operation permits Addition, Subtraction { int apply(int a, int b); } // File: Addition.java public final class Addition implements Operation { @Override public int apply(int a, int b) { return a + b; } } // File: Subtraction.java public final class Subtraction implements Operation { @Override public int apply(int a, int b) { return a - b; } }
Permitting Classes
A sealed class that permits only specified classes to extend it.
Example
// File: Animal.java public sealed class Animal permits Dog, Cat { // common properties and methods } // File: Dog.java public final class Dog extends Animal { // properties and methods specific to Dog } // File: Cat.java public final class Cat extends Animal { // properties and methods specific to Cat }
Real-World Use Case
Financial Transactions
In a financial application, you might want to control the types of transactions that can occur, such as deposits and withdrawals, ensuring no other transaction types are inadvertently created.
Example
// File: Transaction.java public sealed class Transaction permits Deposit, Withdrawal { // common properties and methods } // File: Deposit.java public final class Deposit extends Transaction { // properties and methods specific to Deposit } // File: Withdrawal.java public final class Withdrawal extends Transaction { // properties and methods specific to Withdrawal }
Conclusion
The sealed
keyword in Java provides a powerful mechanism for controlling inheritance and implementation hierarchies. By specifying which classes or interfaces can extend or implement a sealed class or interface, you can ensure a more predictable and secure design. Understanding and using the sealed
keyword effectively is crucial for developing robust and maintainable Java applications.