Eu uso C # e essas são minhas abordagens. 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.
}
Opção 1. Construtor com parâmetros opcionais
public Foo(int i = 0, string s = "bla", Bar b = null)
{
this.i = i;
this.s = s;
this.b = b;
}
Usado como, por exemplo new Foo(5, b: new Bar(whatever))
. Não para versões Java ou C # anteriores a 4.0. mas ainda vale a pena mostrar, pois é um exemplo de como nem todas as soluções são agnósticas de idioma.
Opção 2. Construtor tomando um ú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() { }
}
Exemplo de uso:
FooParameters fp = new FooParameters();
fp.I = 5;
fp.S = "bla";
fp.B = new Bar();
Foo f = new Foo(fp);`
C # do 3.0 em diante torna isso mais elegante com a sintaxe do inicializador de objeto (semanticamente equivalente ao exemplo anterior):
FooParameters fp = new FooParameters { I = 5, S = "bla", B = new Bar() };
Foo f = new Foo(fp);
Opção 3:
redesenhe sua classe para não precisar de um número tão grande de parâmetros. Você pode dividir suas responsabilidades em várias classes. Ou passe parâmetros não para o construtor, mas apenas para métodos específicos, sob demanda. Nem sempre viável, mas quando for, vale a pena fazer.