Beneficio de usar la clase de generador interno estático

9

Durante el curso de la escritura de las pautas de código para una empresa, me encontré recomendando usar el patrón Builder de Effective Java, en lugar de constructores telescópicos.

Sin embargo, después de pensarlo un poco más, seguramente una solución más elegante es simplemente eliminar la clase de generador y también eliminar los constructores adicionales con argumentos opcionales.

Por lo tanto, solo tiene un constructor con los parámetros requeridos, getters / setters normales y comente el código. Al implementar, simplemente cree una nueva instancia del objeto yr y luego establezca valores.

Mi pensamiento original era que el beneficio provenía de eliminar la confusión en cuanto a qué parámetros eran opcionales y qué se requerían; sin embargo, el verdadero beneficio proviene del uso del método de encadenamiento / interfaz fluida.

El patrón de construcción tiene beneficios cuando crea muchas instancias nuevas, ya que el ide puede hacer el trabajo de piernas y también si hay muchos (15+) parámetros opcionales. Sin embargo, ¿vale la pena el tiempo extra codificando la clase interna estática, recomendaría usar el constructor, o es una pérdida de tiempo?

NimChimpsky
fuente
Ver también stackoverflow.com/a/1953567/632951
Pacerier

Respuestas:

8

Tiendo a seguir un patrón según el cual los constructores deberían proporcionar todos los valores obligatorios necesarios para crear un objeto válido y coherente . Para los valores opcionales, trato de pensar cuál debería ser el valor predeterminado más común, para que los establecedores se usen lo menos posible.

Si encuentro que hay muchos valores opcionales o que una proporción mayor de valores opcionales tiende a ser alterada de sus valores predeterminados, entonces usaré el patrón del generador (generador interno estático u otro diseño similar).

Josh generalmente da muy buenos consejos: lo mejor que me gusta de él es que los consejos provienen de las trincheras: admite que cometió errores al diseñar partes de Java, y Java Efectivo es en parte una especie de 'cura' para hablar :-)

Martijn Verburg
fuente
1
Esto no dice nada sobre por qué el interior debería ser estático ...
Jimmy Hoffa
La inmutabilidad y los efectos secundarios gratuitos también son un objetivo.
Martijn Verburg
6

El patrón Builder de Josh Bloch, al igual que el patrón GoF Builder, ofrece una forma de crear un objeto inmutable con muchos datos predeterminados sin largas listas de constructores encadenados.

Si "tiene el único constructor con los parámetros necesarios, getters / setters normales", entonces su objeto ya no es inmutable. es decir. Puede cambiarlo mucho después de crear una instancia.

Si eso no es un problema para usted, entonces nunca necesitó el patrón Builder en primer lugar. Si es un problema, entonces su solución es defectuosa.

pdr
fuente
No creo que el patrón de construcción tenga nada que ver con la mutabilidad, incluso el ejemplo de gof en wiki es mutable ... en.wikipedia.org/wiki/Builder_pattern#Java también, el patrón tiene beneficios que describí en la pregunta.
NimChimpsky
3
@NimChimpsky: no se trata de si el patrón del generador se puede aplicar para crear un objeto mutable. La pregunta es, ¿deberías? Getters y setters han existido durante toda la eternidad, donde los objetos pueden ser mutables, son una solución perfectamente sólida, pero las personas se toparon con un problema común al crear objetos inmutables: cadenas de constructores inmanejables. The Builder fue una solución común y, por lo tanto, se convirtió en un patrón para facilitar la comunicación.
pdr