There are several problems with your approach. Some of them are described in previous answers, so I just mentioned the rest.
The biggest problem with your design is that you are using one instance of Person in the builder. This means that if you use the same builder more than once, you will โcreateโ the same instance, while clients using it expect two different instances. No need to mention that this can lead to serious chaos in your application.
The answer you received from @Basilevs mentions that setters will be required for a โbuiltโ class. This is absolutely true, but I would like to emphasize that this is a huge problem, because it means that the classes you are โbuildingโ can never be immutable! In other words, you forbid developers of such classes to use synchronization to ensure thread safety, if necessary, and other mechanisms for solving problems that could have been avoided using a common approach.
source share