2011-01-06 12 views
17

Estoy pasando por Efectivo Java y algunas de mis cosas que considero de serie no son sugeridas por el libro, por ejemplo creación de objeto, tenía la impresión de que los constructores son la mejor manera de hacerlo y los libros dicen que deberíamos usar métodos estáticos de fábrica, no soy capaz de algunas ventajas y desventajas, y por eso estoy haciendo esta pregunta, aquí están los beneficios de usarla.Creación de objetos: constructores o métodos estáticos de fábrica

Ventajas:

  1. Una de las ventajas de los métodos estáticos de fábrica es que, a diferencia de los constructores, que tienen nombres.
  2. Una segunda ventaja de los métodos estáticos de fábrica es que, a diferencia de los constructores, no están obligados a crear un nuevo objeto cada vez que se invocan.
  3. Una tercera ventaja de los métodos de fábrica estáticos es que, a diferencia de los constructores, pueden devolver un objeto de cualquier subtipo de su tipo de devolución.
  4. Una cuarta ventaja de los métodos estáticos de fábrica es que reducen la verbosidad de crear instancias de tipo parametrizadas.

Desventajas:

  1. La principal desventaja de proporcionar sólo los métodos estáticos de fábrica es que clases sin constructores públicos o protegidos no pueden ser subclases.
  2. Una segunda desventaja de los métodos de fábrica estáticos es que no son fácilmente distinguibles de otros métodos estáticos.

Referencia: Effective Java, Joshua Bloch, Edición 2, pág: 5-10

no soy capaz de comprender la cuarta ventaja y desventaja de la segunda y agradecería si alguien puede explicar esos puntos También me gustaría saber cómo decidir si utilizar Constructor o Método estático de fábrica para la creación de objetos.

+0

En mi humilde opinión, todo se reduce a la complejidad: ¿necesita crear más complejidad si su código no será extendido por nadie más que usted? –

+0

Incluso si nadie más va a extender el código, aún necesita ser entendido fácilmente si vuelves a él dentro de unos meses haciendo mantenimiento/corrección de errores, etc. – Kurru

+0

Entonces, ¿será justo decir que el constructor no creará complejidad y los métodos de fábrica estáticos lo harán? Estoy tratando de entender qué camino traerá más complejidad? – Rachel

Respuesta

17
  • Ventaja 4: Cuando se utiliza un constructor, tiene

    Foo<Map<Key, Value>> foo = new Foo<Map<Key, Value>>(); 
    

    vs

    Foo<Map<Key, Value>> foo = Foo.createFoo(); // no need to repeat 
    

    esta ventaja se ha ido en Java 7, cuando se introdujo la sintaxis de diamantes

  • Desventaja 2. No se puede determinar fácilmente si un determinado método static i s usado para constructor, o para otra cosa.

En cuanto a cómo elegir, no hay una receta única para eso. Puede sopesar todas las ventajas y desventajas mencionadas en un caso de uso, pero en la mayoría de los casos solo será una decisión impulsada por la experiencia.

+0

Bozho: ¿para la desventaja 2, puede sugerir un caso de uso donde no saber si un método estático dado se usa para constructor o no causará un problema importante? Solo trato de entender cuáles serán los efectos dañinos y por qué se menciona como una desventaja. – Rachel

+3

@Rachel: ¿Qué haría un método estático 'getFoo()' en la clase 'Foo'? Crear y devolver un nuevo 'Foo'? O devuelve una instancia hija de 'Foo'? ¿O incluso una instancia singleton? Etc. Desventaja 2, sin embargo, puede supervisarse eligiendo los nombres de los métodos de la manera inteligente como 'createFoo()', 'getChildFoo()' y 'getInstance()'. Se trata de escribir código auto-documentado. – BalusC

+0

@BalusC: Gracias por la explicación, estaba tratando de comparar Static Factory Method vs Constructor y ver por qué es Static Factory Method recomendado por el libro. – Rachel

4

Si conoce el tipo concreto de la clase que está intentando crear, entonces llamar al Constructor está bien.

Métodos de fábrica estáticos son agradables cuando no está del todo seguro de cómo construir el objeto que necesita.

El Método de fábrica todavía llama al Constructor en el tipo concreto, pero el método maneja la decisión sobre qué tipo de clase concreta crear. El método de fábrica devuelve un tipo de interfaz (en lugar de un tipo concreto) para que el tipo de concreto se oculte a la persona que llama.

+1

Un aspecto útil de los métodos de fábrica es que en muchos casos será posible que las versiones futuras de un método de fábrica devuelvan tipos adicionales sin tener que modificar el código subyacente. Por ejemplo, un método 'ImmutableMatrixOfDouble.Create' podría ver si su argumento es una matriz cuadrada cuyos únicos elementos distintos de cero están en la diagonal, y devuelve una' ImmutableDiagonalMatrix'() en tal caso. Una 'ImmutableDiagonalMatrix' de 256x256 solo requeriría alrededor de 1/256 de espacio como una matriz de 256x256, por lo que si caben muchas matrices inmutables que se ajusten al patrón, se podría ahorrar espacio. – supercat

0

Desventaja 2.

un método estático que se utiliza para la creación de objetos tiene el mismo diseño funcional y la apariencia como cualquier otra función estática.

Con solo mirar un método estático que crea objetos, no sabría que lo hace, y lo opuesto es la parte relevante. Cuando está escribiendo código con el que no está familiarizado, puede ser difícil identificar el método estático correcto que se usa para crear objetos.

El uso del Static Factory Pattern está bien documentado y puede ser muy útil, especialmente en las situaciones Singleton y Multiton. También es útil en la inicialización de objetos complejos.

Cuestiones relacionadas