.NET -  Classes Singleton x Static
  Hoje vamos comparar as classes Singleton e Static e fazer uma avaliação sobre as diferenças e similaridades entre essas classes.


As classes Singleton e Static podem ter apenas uma instância disponível na memória, e ambas as classes podem ser usadas para manter o estado global de uma aplicação, porém, existem muitas diferenças entre elas.

Apresentando Singleton


Singleton é um dos padrões de criação de “Gang of Four” (GoF) e garante que uma classe tenha apenas uma instância (restringindo uma classe para instanciar seus vários objetos) e fornece um ponto de acesso global a ela.

 

O código abaixo demonstra como funciona uma classe Singleton (o exemplo foi criado usando um aplicativo console no .NET 6), e demonstra que quando o código for executado, a mesma instância da classe será retornada:

 


Entendendo o código:

 

Nas linhas 1 e 2, existem duas variáveis que recebem a instância da classe Singleton e, quando comparadas, o resultado é que são a mesma instância.

 

Observe que essa classe possui uma propriedade privada (isso é bastante comum em uma classe Singleton) e essa propriedade é estática, e também possui um método que retorna a instância do objeto.

 

No método “Instance”, verifica se a instância da classe já foi criada, e se foi, retornará a instância criada, caso contrário, criará uma instância, e na próxima vez que esta classe for chamada retornará a mesma instância criada (e para isso, um método estático pode ser usado).

 

Existem outras maneiras de implementar um Singleton para mais detalhes veja o meu curso sobre padrões de criação na Udemy.

 

Na plataforma .NET Singleton também é um dos tempos de vida de serviços que podem ser usados com o Microsoft Dependency Injection Container. Abaixo temos a linha de código que define um serviço com o tempo de vida Singleton:


services.AddSingleton<InterfaceName, ClassName>();.
 

Ao usar Singleton, os serviços são criados uma vez durante a vida útil do aplicativo e usarão a mesma instância para todo o aplicativo.

 

Apresentando a classe Static

A palavra Static é uma palavra-chave modificadora (um recurso de linguagem), que pode ser usada para definir classe/métodos/campos/propriedades como estáticos.

Uma classe estática não pode ser instanciada, o que significa que, diferentemente de uma classe não estática, você não pode usar o operador new para criar uma variável do tipo de classe, em vez disso, para usar uma classe estática você pode acessar os membros da classe diretamente.

Além disso, uma classe estática é uma classe selada, portanto, não suporta herança e métodos estáticos não permitem substituição.

A plataforma .NET traz algumas classes estáticas como “System.Math”, “System.Convert” dentre outras, e quando você precisa usar um método da classe Math por exemplo, você pode chamar o método diretamente sem precisar instanciar o classe, assim: Math.Sqrt(16).

No código a seguir, há um exemplo de como criar e usar uma classe estática (a classe TemperatureConverter é da documentação da Microsoft).

Na linguagem C#, você pode criar uma classe estática usando a palavra-chave static:

Entendendo o código:

 

Na linha 1 a classe estática está sendo chamada, o método para converter Celsius para Fahrenheit será executado e o valor será impresso no console.

 

Na linha 4, a classe estática é definida, e na linha 6 há um método estático (observe que todos os métodos dentro de uma classe estática também devem ser estáticos).

Também é possível ter uma classe não estática que tenha métodos, campos, propriedades ou eventos estáticos. No exemplo abaixo temos uma classe não estática com uma propriedade estática.

 

Quando o código for executado, o valor “2” será impresso no console:

 

                   

 

Isso ocorre porque a propriedade QuantidadeDeAlunos é estática, o que significa que mesmo que dois objetos não estáticos sejam criados, ela manterá o mesmo estado para a propriedade estática, mesmo que várias instâncias da classe sejam criadas. Visto que ela é uma propriedade da classe.

Agora se ao invés de ter uma propriedade estática, usarmos uma propriedade normal, o resultado do código será  o número 1 impresso duas vezes:

 

 

Semelhanças entre Singleton e Estático

Como semelhanças entre essas classes destacamos que :

Diferenças entre Singleton e Estático

A seguir temos uma relação das principais diferenças entre as classes:

Assim, as classes estáticas podem ser usadas quando você precisa implementar algum tipo de classe utilitária que não precise de muitas modificações. Como as classes estáticas não permitem instanciação, não haverá objetos duplicados, evitando uso extra de memória.

As classes singleton podem ser usadas quando apenas uma instância de uma determinada classe precisa ser criada e, em seguida, um acesso global simples a essa instância será fornecido para todo o aplicativo, por exemplo, quando você tiver alguns proxies de serviço, uma classe Logger, cache, conexões de banco de dados, etc.

E estamos conversados...

 

"E ouvi uma grande voz do céu, que dizia: Eis aqui o tabernáculo de Deus com os homens, pois com eles habitará, e eles serão o seu povo, e o mesmo Deus estará com eles, e será o seu Deus."
Apocalipse 21:3

 

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti