1
resposta

Aonde fica armazenado o valor de um atributo estático?

Durante as aulas, ficou claro que o valor de cada atributo fica armazenado em uma porção de memória compatível com o seu conteúdo. Ainda, percebemos que cada atributo guarda uma referência à classe na qual ele pertence.

Diante disso, qual é o comportamento de um atributo estático? Ele fica referenciado à uma classe estática de ContaCorrente que é independente das instâncias que criamos?

É possível dizer que você criou uma variável global no seu código dessa maneira?

1 resposta

Gabriel, tudo bem?

A variável estática também estará associada com uma posição de memória referenciada à estrutura de dados em que ela foi declarada (classe), da mesma forma que uma variável de instância, a diferença crucial está em como a CLR irá tratar essa informação junto ao sistema operacional.

Em termos de alocação de memória, os endereços de memória estáticos serão sempre promovidos rapidamente da geração 0 para a geração 2 do heap de memória, isto significa que o garbage collector não precisará validar a referência com tanta frequência quanto outras variáveis que comumente serão desalocadas nas gerações 0 e 1 da heap, essa 'porção' memória será marcada como 'longo prazo' e não será mais liberada da memória.

A variável estática não é uma variável global bem como temos no Visual Basic ou no Java Script, a diferença crucial é que podemos colocar modificadores de acesso às variáveis estáticas enquanto nas globais..bem.. são globais, são enxergadas em qualquer ponto do código. Você pode criar uma variável estática de escopo privado, ou seja que só pode ser acessada dentro do contexto onde foi criada.

O Design Pattern 'Singleton' se vale dessa característica da variável estática para poder permitir que apenas uma instância da classe onde esse padrão de projeto é aplicado seja criada. Há uma discussão se o próprio Singleton é um drible para criar variável global na Orientação a Objetos, mas essa é outra história rs

Vale salientar que quanto mais variáveis globais são declaradas maior será o consumo de memória, como explicado nos alocações do heap, ou seja, vale sempre avaliar se essa informação que será tratada como estática é de fato acessada constantemente e vale o custo de IO vs Memória de buscar de um arquivo ou banco de dados. Se é uma informação que é utilizada uma única vez e está numa variável estática ela nunca mais sairá da memória (mesmo que fique em swap o custo de manter isso não vale a pena), talvez estratégias de cache que mantenham em memória somente informações que são altamente acessadas e somente pelo período que são utilizada seja uma melhor abordagem.

Em linhas gerais é isso, há alguns outros pontos sobre esse assunto mas espero ter dado uma luz.

Até mais!