Frequentemente temos tanta confusão na programação, algumas funções são resolvidas usando singletons, e outras funções são resolvidas usando métodos estáticos, então quais são os princípios e cenários de uso dos métodos estáticos e singletons? Vamos esclarecer isso hoje.
1. Vamos primeiro analisar a diferença entre métodos estáticos e métodos não estáticos?
Muitos programadores entendem que métodos estáticos carregam primeiro, métodos não estáticos carregam depois, métodos estáticos sempre existem na memória e métodos não estáticos não. Portanto, recomenda-se usar um método não estático. Primeiramente, é errado enfatizar que essa compreensão está errada.
Primeiramente, vamos analisar pela memória: quando a aplicação é inicializada, o CLR (CLR é o Common Language Runtime) também é um ambiente de runtime como a máquina virtual Java, responsável pelo gerenciamento de recursos (alocação de memória e coleta de lixo, etc.) e garante a separação necessária entre a aplicação e o sistema operacional subjacente. O CLR possui dois nomes de tradução diferentes: Common Language Runtime e Common Language Runtime. Aloca um espaço de endereçamento para cada processo no espaço disponível do processo, que é o heap gerenciado. O heap gerenciado é dividido em múltiplas regiões, sendo as mais importantes o garbage collection heap (GC Heap) e o loader heap (Loader Heap), que é usado para armazenar instâncias de objetos e é gerenciado pelo GC. A informação mais importante que o Loader Heap armazena através da tabela MethodTable são informações relacionadas a metadados, como tipos base, campos estáticos, interfaces de implementação e todos os métodos. O Loader Heap não aceita controle de GC, e seu ciclo de vida vai da criação à destruição. Em outras palavras, uma vez que uma classe é carregada, tanto os métodos estáticos quanto os não estáticos dessa classe são armazenados na tabela MethodTab do Load Heap, sem controle GC, e todos permanecem na memória para a primeira carga.
Qual é a diferença entre um método estático e um método não estático? A diferença é que, ao criar um objeto, o método estático tem apenas uma cópia, enquanto o método não estático copia uma cópia das informações sobre essa instância no GC Heap para cada novo objeto e, ao mesmo tempo, coloca o novo objeto na pilha. O endereço apontado pelo ponteiro de pilha é o endereço de memória que acabou de ser copiado para o GC Heap. Portanto, em termos de velocidade de chamada de métodos, métodos estáticos são mais rápidos porque métodos não estáticos precisam ser instanciados e alocar memória.
Do ponto de vista da história da programação, quase todos os métodos da programação estruturada inicial eram métodos estáticos, e a introdução dos métodos de instanciação foi uma questão de programação orientada a objetos, então o método de instanciação não resolveu o problema da eficiência de execução e memória. É para tornar o desenvolvimento mais padronizado e orientado a objetos.
A partir da análise acima, pode-se tirar uma conclusão: 1. O método estático e o método não estático são a distinção entre o modo solução. 2. Se herança, polimorfismo ou se um método não tiver relação com o objeto de sua classe, você deve escolher um método estático, como uma classe de ferramenta.
2. Qual é a diferença entre modo singleton e método estático?
Às vezes precisamos manter uma informação na engenharia, como alguns atributos de configuração carregados em tempo de execução, que devem existir durante toda a vida útil da aplicação e são públicos, então apenas uma cópia é necessária. Neste momento, consideraremos usar um método singleton ou estático para manter esses dados, mas no momento, esses dados são obtidos de forma orientada a objetos, usaremos um singleton.
Primeiro, métodos estáticos são baseados em classes, e singletons são baseados em objetos. Se o padrão de resolução for baseado em objetos, use um singleton, caso contrário, use uma abordagem estática. Por exemplo, você precisa herdar classes, implementar interfaces, atrasar a inicialização, reescrever classes pais, etc., para usar singletons; segundo, métodos estáticos são orientados a processos, e singletons são orientados a objetos. Terceiro, variáveis de atributos estáticas não serão eliminadas pelo GC, então os objetos singleton não serão eliminados pelo GC, e objetos gerados em métodos estáticos serão liberados quando o método estático for executado. |