Un objet immuable ne change plus d'état après sa construction : attributs final, pas de setters, et copies défensives pour les attributs modifiables. Il est sûr à partager entre parties du programme et entre threads. String et les types enveloppes sont immuables ; les records le sont par défaut.
Exemple
final class Euro {
private final long centimes;
Euro(long c) { this.centimes = c; }
}