No site do caelum em uma das definições:
Cliente guilherme = new Cliente();
guilherme.Nome = “Guilherme”;
E se esquecermos de chamar a segunda linha desse código, teremos um cliente sem nome. Mas, será que faz sentido existir um cliente sem nome?
Para evitar isso, ao construir nosso objeto temos que obrigar o desenvolvedor a falar qual o nome do Cliente.
Não consigo entender como o desenvolvedor esqueceria de atribuir o nome. Afinal o que isso afeta no codigo?
você obriga a quem instanciar a sua classe a inserir os valores necessários.
Imagine, um método que necessita de um parâmetro, true ou false. Como um desenvolvedor que nunca viu viu a sua classe vai saber que ele deve instanciar a classe com este valor? com o construtor você consegue obriga ele a isso.
O método construtor é o responsável por inicializar a variável, com valores pré definidos passados por parâmetros, como o @jonathan.sky comentou, ou um objeto novo, “zerado”, no caso de construtor sem parâmetros. O construtor é quem orienta o desenvolvedor sobre a forma correta de se inicializar um objeto, como um “bloqueio” pra não setarmos, por exemplo, int idade = “Guilherme”.
Válido tomar como exemplo a classe File, que não possui construtor sem parâmetros. Pensando da seguinte forma: um arquivo tem um diretório (o path
, com todas as pastas que a aplicação deverá percorrer até chegar naquele arquivo). Pra garantir que o programador nunca tente inicializar um arquivo sem nome e diretório, a classe File tem um parâmetro String para receber o diretório com nome do arquivo a ser carregado.
É também dentro do construtor que podemos fazer algumas validações. Ainda como exemplo a classe File, que em Java, um dos construtores é o seguinte:
public File(String pathname) { if (pathname == null) { throw new NullPointerException(); } this.path = fs.normalize(pathname); this.prefixLength = fs.prefixLength(this.path); }
O método recebe uma String pathname
, que se for nula, causará um NullPointerException. Se for uma String válida (uma String, não um diretório), terá seus parâmetros path
e prefixLength
normalizados nas próximas linhas.
Perceba também que no caso específico de C#, a inicialização desse exemplo poderia ser da seguinte forma:
Cliente guilherme = new Cliente(){ Nome = "Guilherme" };
TL;DR;
No construtor, você limita o programador a iniciar um objeto do jeito que você quiser, além de normalizar de alguma forma os parâmetros recebidos.
Além de tudo isso que o pessoal falou, é uma forma de deixar o objeto imutável, deixando sem setters e passando todos os valores no construtor.
1 curtida
Além da possibilidade de instanciar outros objetos dentro do construtor de um objeto. 
Por mais de não achar isso uma boa prática. haha