In addition to possible performance flaws (possibly because with the complexity of GC and HotSpot optimizations, immutable structures are not necessarily slower) - one of the drawbacks may be that the state should now be threaded through your application. For simple applications or tiny scenarios, maintaining state in this way may be too high to buy you concurrency security.
For example, think of a graphical interface such as Swing. It would be entirely possible to write a GUI structure completely using immutable structures and one basic "unsafe" external loop, and I assume this was done in Haskell. Some problems of maintaining a nested immutable state can be considered, for example, using lenses. But managing all interactions (registering listeners, etc.) can be very attractive, so instead you want to introduce new abstractions, such as functional reactive or hybrid reactive graphical interfaces.
Basically, you lose some of the encapsulation of OO, going all immutable, and when that becomes a problem, there are alternative approaches like members or STM.
source share