Clause 13 in Effective Java (Clause 15 in the second edition) provides strategies to minimize variability or to maintain immutability.
Suppose we remove the mutators, but keep the non-final fields and the default constructor. The effect will be a theoretically volatile object, but practically unchanged. Yes, you can mutate an object a little by using reflection, but just by closing open methods, we can at least prevent its mutation in cases where it is not practical to make the object really unchanged.
source share