Algumas sugestões:
1. Se forem parâmetros cujos valores forem recorrentes, crie mais de um construtor, o completo e outros com valores padrão.
Exemplo:
public void Usuario {
public Usuario(String nome, String departamento, String algoritmoDeCriptografiaDaSenha, Calendar dataDeAdmissao, String ... filhos) {
this.nome = nome;
this.departamento = departamento;
this.algoritmo = algoritmoDeCriptografiaDaSenha;
this.dataDeAdmissao = dataDeAdmissao;
this.filhos = Arrays.copyOf(filhos);
}
//Caso mais comum, usuário sem filhos, admitido no dia, usando DES para criptografar a senha.
public Usuario(String nome, String departamento) {
this(nome, departamento, "DES", Calendar.getInstance(), new String[]);
}
}
2. Se forem parâmetros que são recorrentes, mas dentro de um contexto de uma única aplicação (e vão mudar entre aplicações), considere a possibilidade de criar um objeto fábrica. Defina esses parâmetros na fábrica e crie um método de construção mais simples lá, que já use os parâmetros setados (é uma boa tb se os parâmetros do construtor vierem de diferentes lugares. Você poderia criar uma fábrica para ler os parâmetros de um XML, banco de dados, ou recebe-los na aplicação, e escolher que fábrica usar de acordo com o caso). Exemplo:
Considere que sua classe de vários parâmetros seja a de criar uma conexão no banco. Você poderia fazer uma fábrica para ela:
/** Cria uma conexão no BD
Conexões numa mesma aplicação são sempre iguais, mas mudam radicalmente entre aplicações */
public class ConectionFactory {
public String dbName;
public String driverName;
public String dbUser;
public byte[] dbPassword;
public Conexao create() {
return new Conexao(dbName, driverName, dbUser, dbPassword);
}
}
E então essa fabrica retornaria sempre conexões do mesmo tipo.
3. Uma boa forma de evitar erros no código, é deixar os parâmetros obrigatórios no construtor, e usar setters para os opcionais. Você ainda pode simplificar a construção usando invocation channing (o setter retornar o próprio objeto). Essa é uma estratégia comum na implementação de fluent interfaces. Exemplo:
Usuario vinicius = new Usuario("Vinicius", "vgm", "vgm124")
.setIdade(28)
.setEstadoCivil(EstadoCivil.Solteiro)
.setPeso(80.0)
.setAltura(1.78);
Note que eu poderia desprezar todos os sets, mas não poderia desprezar o nome de usuário, nome completo e senha.