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 :
As classes Static e Singleton podem ter apenas uma instância disponível na memória;
Ambas as classes podem ser usadas para manter o estado global de um aplicativo;
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
Referências: