Start here. This is the direct spoken answer to practice first.
Overview
Immutability is an object-level contract; private final fields are necessary in many designs but are not sufficient when referenced values remain mutable.
I would make the class's observable state fixed after construction. Fields are private and normally final, construction validates the complete state, and there are no mutating methods. If a constructor receives a mutable list, array, date-like value, or other mutable object, the class makes a defensive copy. Accessors return immutable values, safe snapshots, or unmodifiable copies rather than the internal mutable object. The class is final, or otherwise designed so a subclass cannot add mutable behavior that breaks the contract.