Sealed Classes - JDK 17

JDK 17 has introduced a lot of new features, one of them is Sealed Classes. Let's understand what are sealed classes and why were they introduced.

We will not use the Animal -> Dog -> Red Dog -> Multicolor Dog or House -> Door -> Mouse type examples as they don't represent what domains do Software Systems deal with.

Consider a scenario where you are building a system that provides the user with home loan interest rates of various banks and lenders. A common dilemma buyers face is opting between a Fixed Interest Loan or a Floating Interest Loan, if you are not aware of these terms, please have a quick read here.

Please be aware that Floating Interest Rates are offered by Nationalized Banks and Fixed Interest Rates are offered by NBFCs in India. If you are not aware of the difference between the two, please have a quick read here. Please be aware that only Nationalized Banks can offer Floating Interest Loans and NBFCs can offer Fixed Interest Loans. This is the because the former is directly and regulated by RBI and the latter isn't. Here is a quick explainer regarding the difference between the two NBFC vs Banks in Home Loans.

Hopefully, you now have a brief idea about the banking/finance terms we have mentioned previously.

Let's assume that we have to build a Java based system, we will declare an interface FloatingInterest that any class can implement. But wait, we don't want anyone to implement FloatingInterest interface as only Nationalized Banks can offer that. Hence we would like to restrict who implements this interface. This is where we can use the concept of sealed interfaces. With that understood, let's delve into the most fun part that is the code.

Notice the sealed keyword before the interface keyword and the permits keyword after the interface name. The sealed keyword must be used the permits keyword to restrict who can implement the interface. Here we have made the FloatingInterestRate interface sealed and permitted only NationalBank to implement/extend it, hence restricting the misuse of the interface.

Let's take a look at the FixedInterestRate interface.

We keep the interface sealed and permit only NBFCs to implement/extend it. Hence we prevent any other Financial Institutions misusing this functionality as it can only be provided by a restricted class(NBFC).

Let's now look at the NationalBank class that implements the FloatingInterestRate interface.

This class is again a sealed one as any class/interface that extends/implements a sealed super type must be declared assealed or non-sealed or final. Hence we declare NationalBank as sealed and permit a few known nationalized Banks in India. Here are the nationalized banks by RBI, google search results.

Here is class SBI representing the largest nationalized bank in India.

We have declared it as final as we are extending a sealed class.

Here is another sub-class of the NationalBank class.

Notice that this class is also final.

Let's see what we have done with the FixedInterestRate interface.

The sealed NBFC class implements it and permits only few NBFCs in India to extend it.

Here are a few sub-classes of the NBFC class:-

Notice that the interest rates are way higher than what the Nationalized Banks offer, before this turns into a Home Loan advice blog, please notice that we extend the sealed NBFC class and thus keep our class as final and override the methods.

Hence, we can conclude that if we want to restrict inheritance and reusability in our code to keep it domain specific, we should use the sealed keyword.

All the code discussed above can be found in this repository on GitHub.

An argument can be made saying that "Why does the NationalBank class restrict the sub-types to a few?". The reason being, establishment of a Nationalized Bank does not happen frequently and thus we keep the NationalBank class sealed until new sub-types are available.

Note:- Any sub-classes/sub-interfaces you mention after the permits keyword must be present in the same package as the super-type(sealed type).

And that's it. I know it was a long read for a short feature but we understood with a real-world use case where sealed classes will be extremely useful.

Feel free to discuss in the comments below or drop me a mail regarding suggestions to improve!