You can create immutable classes "by hand". Just make all fields final and either primitive or reference to immutable type.
This framework just makes it a little bit shorter to type as it automatically generates some boilerplate code.
This framework just makes it a little bit shorter to type as it automatically generates some boilerplate code.
Of course, you cannot get the same guarantees that e.g. Haskell provides. Moreover, unless you return concrete types, that Map<> being returned by a method could be mutable or immutable (it's your guess ;), or hopefully in the documentation).
(And no, Collections.immutableMap doesn't.)
(And then there are problems with the JVM bytecode as well - do you know you can pass 2 into a function expecting a boolean? And sometimes it'll get treated as true and sometimes as false? The JVM is "wonderful" like that.)