2012-03-27 18 views
5

No estoy seguro de si se ha hecho una pregunta similar antes, la busqué, pero no obtuve ninguna respuesta útil.Setters vs constructores sobrecargados en Java

Como lo sugiere la pregunta, ¿qué es mejor tener un constructor sobrecargado o tener múltiples funciones de configuración?

Escenario:

public class Something { 

    private int a; 
    private int b; 

    public Something(int a, int b) { 
     this.a = a; 
     this.b = b; 
    } 
    ... // Do Something 
} 

Ahora, mi requisito básico era para tener sólo dos parámetros. Ahora, mañana, el requisito se cambia y me piden que agregue un nuevo parámetro, c y luego el día siguiente d, y me dan una declaración que dice que podemos tener más campos.

Ya tengo dependencia para este constructor en proyectos múltiples. Ahora, volviendo a mi pregunta

  • ¿Es aconsejable seguir agregando los nuevos campos al constructor ya sobrecargado?
  • ¿Crear un nuevo constructor sobrecargado cada vez que necesito agregar un nuevo campo para no romper el código dependiente?
  • o simplemente utilizar el constructor por defecto vacío predeterminado y utilizar los emisores solamente (echar a perder mi inmutabilidad, que no es de gran preocupación)

¿Cuál es el consejo que usted me puede dar?

+4

"estropeando mi inmutabilidad, que no es motivo de gran preocupación" Si se ha esforzado por hacer que una clase sea inmutable (y por lo tanto mucho más fácil de razonar), no desperdicie ese trabajo a la ligera. –

+1

'... ¿Qué es mejor, tener un constructor sobrecargado o tener múltiples funciones de configuración?' "Sí". Pero en serio, todo depende del contexto. A veces necesita ambos, a veces se requiere que trabaje dentro de las restricciones de JavaBeans, ... –

Respuesta

9

La manera más agradable de hacerlo es continuar agregando los campos a su constructor - tener arregladores significa que no puede tener objetos inmutables, y los objetos inmutables siempre son agradables - pero posiblemente investigar el builder pattern, que puede lo ayuda a limitarse a un solo constructor al que el objeto constructor llama y "rellena".

+1

La sobrecarga del constructor/método puede ser confusa. Patrón de constructor a veces útil. (+1) –

1

El objetivo de tener diferentes constructores es aumentar la reutilizabilidad de la clase. Creo que será más útil tener algunos constructores diferentes que se adapten a sus necesidades en lugar de tener muchos ajustadores. También los constructores son más específicos y mejoran la legibilidad de su clase y la API.

+0

En realidad, en lo que respecta a la legibilidad y reutilización de API, los establecedores tienen una ventaja, IMO. Puede elegir y elegir qué establecer, y todos los que ven el código que los invoca saben lo que hacen, en lugar de ver, por ejemplo, los parámetros de cadena primero y segundo del constructor, y preguntándose qué se supone que son. y cual es cual – trutheality

4

Lo bueno de un constructor, a diferencia de los instaladores, es que le permite imponer la configuración de las propiedades requeridas para una instancia, en lugar de tener el objeto en mal estado hasta que se llame a sus instaladores correctos. Además, como se menciona en los otros carteles, la inmutabilidad puede ser algo muy bueno, especialmente en un contexto de múltiples subprocesos.

Sin embargo, sus instintos son correctos: los constructores pueden volverse difíciles de manejar. Para secundar los otros carteles una vez más, el builder pattern puede darte lo mejor de ambos mundos en esta situación. Si no desea que el constructor sea una clase anidada del producto, como se describe en el ejemplo de Java en el artículo de Wikipedia, simplemente colóquelo en el mismo paquete que el producto y proporcione al producto los setters protegidos por paquetes. . Además, puede agregar lógica para imponer la configuración de propiedades obligatorias cuando la persona que llama declara que el edificio está completo.

0

¿Sus otros proyectos que dependen del constructor 2-arg se benefician de algún modo de los nuevos parámetros? ¿Los constructores de 2 arg tienen sentido con sus nuevos requisitos?

Quizás necesite crear otra clase, p. SomethingEx(Something) que llevaría campos adicionales y tendría diferentes constructores, pero compartiría métodos útiles.

Si los métodos útiles para compartir son pocos y muy cortos, puede ser mejor crear una clase completamente diferente, solo para tener menos dependencias.

Cuestiones relacionadas