A class with setters whose values should only be set at construction — every late-mutation site is using the setter for what should be a one-shot assignment.
Fields whose values should only be set at construction lose their setters; callers either construct a new object or call a domain method that changes the field as a side effect of doing real work.
Before the refactoring
class Person {setName(n) { this._name = n; }}
After the refactoring
class Person {constructor(name) { this._name = name; }name() { return this._name; }}
Late mutations introduce timing-dependent bugs; consumers can't trust the object's invariants between operations; immutability arguments break.
Removing a setter forces every legitimate update through a more meaningful method — verify there's a domain action behind every setter call before deleting it.
Immutable-by-default classes; bugs from late mutation vanish; the API expresses what users can actually do.
Removing setters that genuinely encode a meaningful state change — a `markPaid()` setter that mutates `paidAt` and `status` together — without replacing them with a richer domain method.