Sealed Classes/Interfaces in Java

Doğukan HAN
2 min readAug 30, 2022

--

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:

  1. sealed: Only permitted classses can implement.
  2. non-sealed: Every class can implement.
  3. 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

--

--