I understand that Immutable Objects are the ones which can't be changed once instantiated. And, there are few guidelines to follow to make any object as Immutable:
1. Mark the class as final
2. Mark all fields as private and final
3. Don't provide any setters/mutators
What is the need of marking the fields as private and final while the class is already marked as final? Also, if we mark all the fields as private and final and don't mark the class as final then what is the harm in that?
Guideline 3 is redundant if you follow guideline 2.
Note that these are not enough to make a class immutable. You need to perform defensive copying on mutable components of your class in your constructor, and return unmodifiable views of them (or copies) in assessors.
Methods that are supposed to return the same result every time for a given object need to be final to prevent a subclass from overriding that behavior. The easiest way to do that is to make the class final (which is just good practice to start with). It's not necessary to make the whole class final though, as long as all methods your class contains are final, including those inherited from Object. Any methods added by a subclass that don't behave as if the object is immutable won't violate the contract of the base class. It's highly confusing though, and just making the entire class final is better.