I know the usual reasons that apply to general immutable classes, viz
- can not change as a side effect
- easy to reason about their state
- inherently thread safe
- no need to provide clone/copy constructor/factory copy method
- instance caching
- no need for defensive copies.
However, wrapper classes represent primitive types, and primitive types are mutable. So why aren’t wrapper classes mutable?
Firstly, String isn’t a primitive type.
Secondly, it makes no sense to talk about the primitive types being mutable. If you change the value of a variable like this:
That’s not changing the number 5 – it’s changing the value of
x.While the wrapper types could have been made mutable, it would have been annoying to do so, in my view. I frequently use readonly collections of these types, and wouldn’t want them to be changeable. Very occasionally I want a mutable equivalent, but in that case it’s easy enough to come up with one, or use the
Atomic*classes.I find myself wishing that
DateandCalendarwere immutable far more often than I find myself wantingIntegerto be mutable… (Of course I normally reach for Joda Time instead, but one of the benefits of Joda Time is immutability.)