Jun 25

Sealed Classes and Records in Java

What Are Sealed Classes?

Sealed classes allow you to restrict which classes can extend or implement them. This provides a way to control the class hierarchy, ensuring that only specific, predefined classes can be part of that hierarchy.

In below example, Shape is a sealed class, meaning only Circle, Rectangle, and Square can extend it. This ensures the hierarchy is controlled and prevents unintended classes from becoming part of it.
What Are Records?

Records provide a compact syntax for declaring classes that are intended to be simple data carriers. They automatically generate methods like toString(), equals(), and hashCode().

With records, you can create immutable data carriers with minimal boilerplate code. The Person record in below example automatically provides methods to access its fields and a proper toString() implementation.
Combining Sealed Classes and Records

You can also combine these features to leverage both concise syntax and controlled inheritance.
In below combined example, Shape is a sealed interface, and Circle, Rectangle, and Square are records that implement this interface. This approach offers both conciseness and controlled inheritance.
Comparison with Traditional Approach

To highlight the benefits of sealed classes and records, let's compare them to a traditional implementation. Below is the example:

Trade-offs

  • Conciseness: Using records significantly reduces boilerplate code as getters, toString(), equals(), and hashCode() methods are automatically provided.
  • Safety: Sealed classes ensure that the class hierarchy is well-defined and closed for extension by unauthorized classes, providing better control over the inheritance.
  • Extensibility: One downside of sealed classes is that they restrict who can extend them. This can be limiting for clients who need to add new types to the hierarchy. In such cases, using composition over inheritance or defining clear extension points might be more suitable.


Conclusion

Sealed classes and records in Java offer a modern, concise way to model data and control inheritance. While they bring significant benefits in terms of reducing boilerplate code and providing a well-defined class hierarchy, they also come with certain trade-offs, especially regarding extensibility.

--Happy Coding!
Created with