102 votos

Gestión de constructores con muchos parámetros en Java 1.4

En algunos de nuestros proyectos, hay una jerarquía de clases que añade más parámetros como va la cadena de suministro. En la parte inferior, algunas de las clases que puede tener hasta 30 parámetros, de las cuales 28 son solo está pasando en el super constructor.

Voy a reconocer que el uso automático de DI algo como Guice sería bueno, pero debido a algunas razones técnicas, estos proyectos están limitados a Java 1.4.

Una convención de la organización de los argumentos en orden alfabético tipo no funciona porque si un tipo es refactorizar (el Círculo que fueron pasando por el argumento 2 es ahora una Forma) que de repente puede estar fuera de orden.

Esta pregunta podría ser específicas y lleno de "Si ese es tu problema, lo estás haciendo mal a un nivel de diseño" críticas, pero estoy buscando cualquier punto de vista.

254voto

Eli Courtwright Puntos 53071

El Generador de Patrón de Diseño puede ayudar. Considere el siguiente ejemplo

public class StudentBuilder
{
    private String _name;
    private int _age = 14;      // this has a default
    private String _motto = ""; // most students don't have one

    public StudentBuilder() { }

    public Student buildStudent()
    {
        return new Student(_name, _age, _motto);
    }

    public StudentBuilder name(String _name)
    {
        this._name = _name;
        return this;
    }

    public StudentBuilder age(int _age)
    {
        this._age = _age;
        return this;
    }

    public StudentBuilder motto(String _motto)
    {
        this._motto = _motto;
        return this;
    }
}

Esto nos permite escribir código como

Student s1 = new StudentBuilder().name("Eli").buildStudent();
Student s2 = new StudentBuilder()
                 .name("Spicoli")
                 .age(16)
                 .motto("Aloha, Mr Hand")
                 .buildStudent();

Si dejamos fuera de un campo requerido (presumiblemente es necesario introducir el nombre) entonces podemos tener el Estudiante constructor, se produce una excepción cuando un parámetro necesario es nulo. Y nos permite tener default/opcional de argumentos sin necesidad de seguir la pista de cualquier tipo de argumento de orden, ya que el orden de las llamadas funcionará igual de bien.

23voto

JeeBee Puntos 11882

¿Puede encapsular parámetros relacionados dentro de un objeto?

por ejemplo, si los parámetros son como



MyClass(String house, String street, String town, String postcode, String country, int foo, double bar) {
  super(String house, String street, String town, String postcode, String country);
  this.foo = foo;
  this.bar = bar;
 

entonces usted podría tener lugar:



MyClass(Address homeAddress, int foo, double bar) {
  super(homeAddress);
  this.foo = foo;
  this.bar = bar;
}
 

14voto

Michael Myers Puntos 82361

¿Qué es probable que desee hacer es tener una clase Constructor. De allí tendría que hacer algo como esto:

 MyObject obj = new MyObjectBuilder().setXxx(myXxx)
                                    .setYyy(myYyy)
                                    .setZzz(myZzz)
                                    // ... etc.
                                    .build();
 

Consulte la página 8 y siguientes de esta presentación Josh Bloch (PDF), o esta revisión de Effective Java

4voto

Guðmundur Bjarni Puntos 1778

A medida que se ven limitados a Java 1.4, si desea DI luego primavera sería una opción muy decente. DI es sólo útil en lugares donde los parámetros del constructor son servicios o algo que no varía durante el tiempo de ejecución.

Si usted tiene todas esas diferentes constructores debido al hecho de que desea opciones variables sobre cómo construir un objeto, deberías considerar seriamente usar el Builder.

4voto

Mnementh Puntos 19831

La mejor solución es no tener demasiado de los parámetros en el constructor. Sólo los parámetros que realmente se necesita en el constructor, son parámetros que se necesitan para inicializar correctamente el objeto. Usted puede tener constructores con parámetros múltiples, pero también tiene un constructor con sólo el mínimo de parámetros. Los constructores adicionales llamamos a este simple constructor y después de que las incubadoras para ajustar los demás parámetros. De esta manera usted puede evitar la cadena-el problema con más y más parámetros, pero también tienen algunas conveniencia-constructores.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X