Two cases spring immediately to mind.
If you use instances of the class as keys in a Map, or you have them
in a Collection that you expect to always be sorted, then immutability
guarantees that your sorting won't inadvertantly get screwed up by
someone calling a setter at inopportune times. With immutable keys,
the only thing that can mess with your sorting is when the
Collection's setters are called. The alternative to immutability would
be for the class to fire events whenever you changed something and the
Collections classes to be sensitive to such events and be able to
auto-resort themselves, but this gets real messy real quick.
Also, for String, allowing it to be changed at any time would be a
security hazard when used within security-sensitive library
functions. As an example, I could send in username "guest" and
password "guest" as Strings to some function and then at some later
time, after I had been authenticated, change the contents of the
username String to "root". Unless the library was carefully written,
this has the potential of being a security problem. As things are, the
fewer of these pitfalls exist, the better.
How many of your methods take some object instance as parameter, hang
on to it and expect it not to change thereafter? Any that do are
vulnerable to malfunction when the instance gets mutated from the
outside.
Thank you
Cheers
Bent D