Yo uso C #, y estos son mis enfoques. Considerar:
class Foo
{
// private fields only to be written inside a constructor
private readonly int i;
private readonly string s;
private readonly Bar b;
// public getter properties
public int I { get { return i; } }
// etc.
}
Opción 1. Constructor con parámetros opcionales
public Foo(int i = 0, string s = "bla", Bar b = null)
{
this.i = i;
this.s = s;
this.b = b;
}
Usado como por ejemplo new Foo(5, b: new Bar(whatever))
. No para las versiones de Java o C # anteriores a la 4.0. pero vale la pena mostrarlo, ya que es un ejemplo de cómo no todas las soluciones son independientes del idioma.
Opción 2. Constructor tomando un único objeto de parámetro
public Foo(FooParameters parameters)
{
this.i = parameters.I;
// etc.
}
class FooParameters
{
// public properties with automatically generated private backing fields
public int I { get; set; }
public string S { get; set; }
public Bar B { get; set; }
// All properties are public, so we don't need a full constructor.
// For convenience, you could include some commonly used initialization
// patterns as additional constructors.
public FooParameters() { }
}
Ejemplo de uso:
FooParameters fp = new FooParameters();
fp.I = 5;
fp.S = "bla";
fp.B = new Bar();
Foo f = new Foo(fp);`
C # de 3.0 en adelante lo hace más elegante con la sintaxis del inicializador de objetos (semánticamente equivalente al ejemplo anterior):
FooParameters fp = new FooParameters { I = 5, S = "bla", B = new Bar() };
Foo f = new Foo(fp);
Opción 3:
Rediseñe su clase para que no necesite una cantidad tan grande de parámetros. Podría dividir sus responsabilidades en varias clases. O pase los parámetros no al constructor, sino solo a métodos específicos, bajo demanda. No siempre es viable, pero cuando lo es, vale la pena hacerlo.