C# - Construtor privado


 Hoje veremos o que é e como usar um construtor privado na linguagem C#.

O que é um construtor private ou privado e porque ele existe ?

Segundo a documentação temos que :

Sintaxe:

private nome_do_constructor
{
   // Código
}

Qual o uso de um construtor privado ?

Vejamos o uso deste recurso na prática criando um projeto do tipo Console (.NET Core).

Vamos criar uma classe Usuario com um construtor privado e tentar criar uma instância dessa classe:

Ao tentar criar a instância da classe o compilador emite o erro:
"Usuario.Usuario() is inacessible due to its protection level"

Se você não usar um modificador de acesso com o construtor, ele ainda será privado por padrão. No entanto, o modificador private geralmente é usado explicitamente para deixar claro que a classe não pode ser instanciada.

Teremos o mesmo comportamento se tentarmos herdar da classe Usuario:

Naturalmente se eu criar outro construtor público poderei ter acesso a ele normalmente:

Note que comentamos a linha de código que usa o construtor privado.

Além de evitar a herança, e a criação de instância da classe, podemos usar um construtor privado para criar uma única instância da classe.

Nota: A declaração do construtor vazio impede a geração automática de um construtor sem parâmetros.

Este recurso é usado no padrão Singleton. (Embora exista muita controvérsia no uso deste padrão)

Abaixo temos a classe DemoSingleton que usa o construtor privado para permitir criar apenas uma única instância da classe:

Vejamos alguns detalhes do código:

- Definimos uma string privada e estática chamada InstanciaCriadaEm;
- Criamos uma  variável estática instancia  do tipo DemoSingleton;
- Criamos um construtor privado (private) onde atribuímos a data atual à variável acima;
- Criamos um método estático que retorna um DemoSingleton onde verificamos se o valor da variável instancia é null, e neste caso criamos uma instância de DemoSingleton;

-
Exibimos o valor de InstanciaCriadaEm em retornamos o valor de instancia;

Executando o projeto teremos o seguinte resultado:

Observe que o valor da variável InstanciaCriadaEm é o mesmo para as 3 tentativas de criar uma instância da classe DemoSingleton o que indica que na verdade somente a primeira instância foi criada e as demais instâncias representam a mesma instância que foi criada apenas uma vez.

Graças ao construtor privado acabamos de implementar um versão bem simples do padrão Singleton.

Pegue o projeto aqui :  CShp_ConstrutorPrivado.zip

"Quão grandes são, Senhor, as tuas obras! Mui profundos são os teus pensamentos."
Salmos 92:5

Referências:


José Carlos Macoratti