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:
C# - StreamReader, StringReader e TextReader
C# - Imprimindo um arquivo texto
C# - Usando OpenFileDialog
C# - Formatando arquivos textos