Sealed Classes/Interfaces in Java
--
Sealed is a new keyword that you can use in the latest java versions. It is an addition to Java’s object-oriented structure. It can be used in both classes and interfaces. We use sealed to prevent unauthorized implementations.
Whenever an interface or a class is marked with sealed, can only be accessed by permitted classes or interfaces.
Three different keyword are available:
- sealed: Only permitted classses can implement.
- non-sealed: Every class can implement.
- permits: Used for specifying permitted classes. If you permit a class(or an interface) the permitted class must implement it.
Let’s define Language interface:
interface Language {}
Let’s create some implementations
class English implements Language {
}
class Turkish implements Language {
}
class French implements Language {
}
If we mark Language as sealed, we will get errors in English, Turkish and French classes. Because implementers must be final, sealed, or non-sealed
sealed interface Language {}non-sealed class English implements Language {}
final class Turkish implements Language {}final class AdvancedFrench extends French{
}sealed class French implements Language{}
In this sturcutre:
1. English can be extended without any limitation.
2. Turkish is a final class. There is no way to extend it.
3. French can only be extended by AdvancedFrench.
If you mark a class or an interface with sealed, you must have at least one subclass of it. This is why I added Advanced French.
You can add any permitted implementations after the Permits keyword.
sealed interface Language permits
English, Turkish, French
{
}
With the code above, you can no longer extend or implement the Lanugage interface except English, Turkish, French classes(or interfaces).
If you permit a class(or an interface) the permitted class must implement it. Because of that below code fails. Turkish class must implement Lanuage.
class Turkish {
}
sealed interface Language permits
Turkish
{
}
The implementation must be direct. You can’t permit a class’s child. The below code will fail. AdvancedFrench
must dirrectly implement Language interface.
sealed interface Language permits
English, Turkish, AdvancedFrench
{
}sealed class French implements Language
permits AdvancedFrench
{
}final class AdvancedFrench extends French{
}
You can use interfaces in the permits section.
sealed interface HumanInteraction
permits Language
{
}
sealed interface Language extends HumanInteraction
{
}
You can use records in the permits section. Records are final, so you don’t have to add anything else.
record LangTool() implements Language {}
sealed interface Language permits
LangTool
{
}
Referances:
https://docs.oracle.com/en/java/javase/17/language/sealed-classes-and-interfaces.html