The first exercise junior programmers do. IDEs, tutorial and senior developers keep teaching them this anti-pattern.
Set essential attributes on private initialization.
Mutation brings lots of problems
Information Hiding Violated
First step will be to forbid public attributes (if language allows them).
Secondly, we will search for methods setXXXX(), analyzing method structure (should be an assignment to attribute xxxx).
We should not forbid methods setting accidental state since this is valid. They should not be named setters since they ask the object to change, but they don't set anything.
Setting attributes is safe for non-essential attributes.
But it has all drawbacks and considerations already mentioned.
Creating incomplete and anemic objects is a very bad practice violating
mutability, fail fast principle and real world bijections.
Here is the full discussion on Setters
Object-oriented programming languages support encapsulation, thereby improving the ability of software to be reused, refined, tested, maintained, and extended. The full benefit of this support can only be realized if encapsulation is maximized during the design process.