Definitivamente debería preferir crear un nuevo objeto en la gran mayoría de los casos. Problemas al reasignar todas las propiedades:
- Requiere setters públicos en todas las propiedades, lo que limita drásticamente el nivel de encapsulación que puede proporcionar
- Saber si tiene algún uso adicional para la instancia anterior significa que necesita saber en todas partes que se está utilizando la instancia anterior. Entonces, si clase
A
y clase B
son instancias pasadas de clase, C
entonces deben saber si alguna vez pasarán la misma instancia, y si es así, si la otra todavía la está usando. Esto une estrechamente las clases que de otra manera no tendrían razón de ser.
- Conduce al código repetido, como lo indicó gbjbaanb, si agrega un parámetro al constructor, en todos los lugares que llaman al constructor no se compilará, no hay peligro de perder un lugar. Si solo agrega una propiedad pública, tendrá que asegurarse de buscar y actualizar manualmente cada lugar donde los objetos se "restablecen".
- Aumenta la complejidad. Imagina que estás creando y usando una instancia de la clase en un bucle. Si usa su método, ahora tiene que hacer una inicialización separada la primera vez a través del ciclo, o antes de que comience el ciclo. De cualquier manera es un código adicional que debe escribir para admitir estas dos formas de inicialización.
- Significa que su clase no puede protegerse de estar en un estado no válido. Imagina que escribiste una
Fraction
clase con un numerador y un denominador, y quisiste exigir que siempre se redujera (es decir, el mcd del numerador y el denominador era 1). Esto es imposible de hacer bien si desea permitir que las personas establezcan públicamente el numerador y el denominador, ya que pueden pasar de un estado no válido a otro para pasar de un estado válido a otro. Por ejemplo, 1/2 (válido) -> 2/2 (inválido) -> 2/3 (válido).
- No es del todo idiomático para el lenguaje en el que está trabajando, lo que aumenta la fricción cognitiva para cualquiera que mantenga el código.
Todos estos son problemas bastante significativos. Y lo que obtienes a cambio del trabajo extra que creas es ... nada. La creación de instancias de objetos es, en general, increíblemente barata, por lo que el beneficio de rendimiento casi siempre será totalmente insignificante.
Como se mencionó en la otra respuesta, el único momento en que el rendimiento podría ser una preocupación relevante es si su clase realiza un trabajo significativamente costoso en la construcción. Pero incluso en ese caso, para que esta técnica funcione, deberá poder separar la parte costosa de las propiedades que está restableciendo, por lo que podrá usar el patrón de peso mosca o similar en su lugar.
Como nota al margen, algunos de los problemas anteriores podrían mitigarse un poco al no usar setters y en su lugar tener un public Reset
método en su clase que tome los mismos parámetros que el constructor. Si por alguna razón quisieras seguir esta ruta de reinicio, probablemente sería una forma mucho mejor de hacerlo.
Aún así, la complejidad y la repetición adicionales que se suman, junto con los puntos anteriores que no aborda, siguen siendo un argumento muy persuasivo en contra de hacerlo, especialmente cuando se comparan con los beneficios inexistentes.