As per Java specification, following are the rules for creating an
Immutable object:
Do not provide "setter" methods that modify fields or objects
referred to by fields.
Make all fields final and private.
Do not allow subclasses to override methods. The simplest way to
do this is to declare the class as final. A more sophisticated
approach is to make the constructor private and construct instances
in factory methods.
If the instance fields include references to mutable objects, do not
allow those objects to be changed.
Do not provide methods that modify the mutable objects.
Do not share references to the mutable objects. Never store
references to external, mutable objects passed to the constructor; if
necessary, create copies, and store references to the copies.
Similarly, create copies of your internal mutable objects when
necessary to avoid returning the originals in your methods
https://www.digitalocean.com/community/tutorials/how-to-create-immutable-class-in-java