segunda-feira, 9 de fevereiro de 2015

0.0.0.11.1.0 - Static NÃO significa constante.

Em Java, a palavra chave static identifica variáveis que existem durante toda a execução do programa. Seus valores PODEM mudar durante a execução*.

... agora a explicação sobre static...

Origem da palavra

Existem várias forma de definir Ciclo de Vida de um Programa (veja post a respeito). Usarei a primeira:


1. Compilation time2. Combination time
3. Request time
4. Activation time
5. Run time
6. Postrun time
"

Há aspectos do programa que são definidos durante a execução (Run time), como valores de variáveis e instanciação de objetos. Há os que PODEM ser definidos durante a execução como alocação de memória para arrays e vinculação de objetos (binding). O que for definido em run time dizemos que é definido dinamicamente.

Em contraposição, o que é definido antes é definido estaticamente, por exemplo definições de classes e atribuições de nomes (name binding).

Existe um motivo técnico e histórico para essa distinção. Certamente nos anos 1990 era assim, mas pode ter mudado até agora (2015) ou pode vir a mudar.
Nos anos 1990, em Windows, os executáveis eram segmentados na memória de forma que havia um espaço para o código (Code Segment) e um espaço para pilha de execução (Stack Segment). O restante do espaço de memória, liberado para o programa usar, era chamado heap (que com o heap do heapsort só tem em comum o nome). Em linguagens procedurais como C as variáveis globais eram alocadas no segmento de código e tinham lugar no arquivo executável do programa. As locais e alocadas dinamicamente não tinham lugar no executável e eram alocadas no heap. Num certo sentido as variáveis globais existiam antes da execução (e por isso são apelidadas estáticas). As locais e dinamicamente alocadas são dinâmicas.

Acredito que essa seja a origem da palavra static em Java, embora não tenha encontrado referência dizendo exatamente isto**.

Funcionamento em Java

Em Java, as variáveis modificadas com static existem e são acessíveis antes da instanciação do objeto.

Essas variáveis também são únicas para todas as instâncias da classe, ou seja, se instanciamos 100 objetos da mesma classe que tem uma variável estática ela é a mesma compartilhada por todas as instâncias, tornando as instâncias dependentes.

Dependência entre instâncias tem efeitos contra-intuitivos para a maioria de nós: Permite modificar a variável por uma instância e acessar por outra***.

 Na minha opinião, declarar variáveis com static em java está mais para um recurso usado enquanto não se sabe ou não se usa instanciação (o que acontece em cursos básicos de programação como este) do que uma solução para algum problema no código.
Se algo não funciona sem static e funciona com static, convém checar e re-checar se é isso mesmo que se quer, ou se tem algum efeito indesejado.

Anotações
* se você quer algo cujo conteúdo não possa ser modificado procure final em Java ou #define em C.
** reflexão (Java reflection ) é um mecanismo que talvez "borre" essa distinção.
*** não é thread-safe (o que pode ser importante em programas que atendem vários usuários simultaneamente).

Nenhum comentário:

Postar um comentário