javarecordjava-17final-class

What is the difference between a final Class and a Record?


In simple words what is the difference between a final class and a record in Java 17?

In which case should I use a record?


Solution

  • Record is an immutable class, i.e. all its fields are final. Records are implicitly final, hence as well as regular final class record can't be extended.

    There are a number of restrictions imposed on records (for more details, take a look at JEP 395).

    Contrary to normal classes:

    Records are meant to be "transparent carriers for immutable data" as JEP 395 says.

    They are designed to be concise, default constructor, getters, hashCode/equals and toString() will be generated by the compiler for you. So that inside a record you need to declare only your custom logic (if any) and record declaration can be literally a one-liner.

    Records differ a lot from regular final classes.

    Also, apart from the peculiarities mentioned above, the mechanism of serialization / deserialization was reimplemented for records, so that deserialization doesn't bypass the constructor.

    In which case should I use a record?

    In short, if your objects must be stateful, or you need to extend a particular class, then you can't utilize record in such a case.

    On the other hand, if your objects are meant to just carry the data, they are not intended to be modified or inherit from other classes, then it might be a good candidate to be implemented as a record.