151 Java - Sealed Classes and Interfaces
Java 15 introduced a sealed class as a preview feature which provides a fine-grained control over inheritance. Java 16 provides some minor enhancements and keeps this feature as a Preview. With Java 17, sealed class and interface a standard features. A sealed class/interface feature is added to Java to provide developers a fine fine-grained control over inheritance. A sealed class can define the subtypes that are permitted to extend it while other classes cannot extend it.
The following are salient points to consider for a sealed class −
- A sealed class is declared using a sealed keyword.
- Sealed classes allow to declaration of which class can be a subtype using the permits keyword.
- A class extending sealed class must be declared as either sealed, non-sealed, or final.
- Sealed classes help in creating a finite and determinable hierarchy of classes in inheritance.
Sealed Interface
An interface can be marked as sealed interface using sealed keyword and then using permits keywords, we can add the interfaces which can extend this interface.
public sealed interface Person permits Employee, Manager { }
Sealed Interface Example
In this example, we've created a sealed interface Person which permits Employee and Manager interfaces to extend it. Employee and Manager interfaces have different methods to get the ID of a person. Now in order to get ID of a person, we're using instanceof operator to check an instance being of Employee or Manager and get the corresponding ID. Thus we can see, that knowing the permissible interfaces upfront helps in development for such scenarios.
Let us compile and run the above program, this will produce the following result −
Id: 23
Sealed Class
Similar to sealed interface, a class can be marked as sealed class as well using sealed keyword and then using permits keywords, we can add the subclasses which can extend this class.
public abstract sealed class Person permits Employee, Manager { }
A subclass needs to have a modifier as sealed/final or non-sealed.
public final class Manager extends Person { }
A subclass with non-sealed is open for all classes to extend.
public non-sealed class Employee extends Person { }
Constraints
There are few constraint on usage of sealed classes which we should notice while extending a sealed class.
Permitted subclass should be part of same module as of sealed class.
Permitted subclass has to extend the sealed class.
A permitted subclass has to use any one of final, sealed, or non-sealed modifier.
Sealed Class Example
In this example, we've created a sealed abstract class Person which permits Employee and Manager classes to extend it. Employee and Manager classes have different methods to get the ID of a person. Now in order to get ID of a person, we're using instanceof operator to check an instance being of Employee or Manager and get the corresponding ID. Thus we can see, that knowing the permissible SubClasses upfront helps in development for such scenarios.
Let us compile and run the above program, this will produce the following result −
Id: 23

Comments
Post a Comment