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?
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:
final
, which is a very important distinction);extends
clause is not allowed with records, because every record implicitly extends abstract class Record;abstract
, sealed
, or non-sealed
(as a consequence of being implicitly final
);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
.