Precisamos distinguir dois aspectos das constantes:
- nomes de valores conhecidos no momento do desenvolvimento, que apresentamos para melhor manutenção, e
- valores que estão disponíveis para o compilador.
E depois há um terceiro tipo relacionado: variáveis cujo valor não muda, ou seja, nomes para um valor. A diferença entre essas variáveis imutáveis e uma constante é quando o valor é determinado / atribuído / inicializado: uma variável é inicializada em tempo de execução, mas o valor de uma constante é conhecido durante o desenvolvimento. Essa distinção é um pouco confusa, pois um valor pode ser conhecido durante o desenvolvimento, mas na verdade é criado apenas durante a inicialização.
Mas se o valor de uma constante for conhecido no tempo de compilação, o compilador poderá executar cálculos com esse valor. Por exemplo, a linguagem Java tem o conceito de expressões constantes . Uma expressão constante é qualquer expressão que consiste apenas em literais de primitivas ou cadeias, operações em expressões constantes (como conversão, adição, concatenação de cadeias) e em variáveis constantes. [ JLS §15.28 ] Uma variável constante é uma final
variável que é inicializada com uma expressão constante. [JLS §4.12.4] Então, para Java, esta é uma constante em tempo de compilação:
public static final int X = 7;
Isso se torna interessante quando uma variável constante é usada em várias unidades de compilação e, em seguida, a declaração é alterada. Considerar:
Agora, quando compilarmos esses arquivos, o B.class
bytecode declarará um campo Y = 9
porque B.Y
é uma variável constante.
Mas quando alteramos a A.X
variável para um valor diferente (digamos X = 0
) e recompilamos apenas o A.java
arquivo, B.Y
ainda se refere ao valor antigo. Este estado A.X = 0, B.Y = 9
é inconsistente com as declarações no código fonte. Feliz depuração!
Isso não significa que as constantes nunca devem ser alteradas. As constantes são definitivamente melhores que os números mágicos que aparecem sem explicação no código fonte. No entanto, o valor de constantes públicas faz parte da sua API pública . Isso não é específico para Java, mas também ocorre em C ++ e outras linguagens que apresentam unidades de compilação separadas. Se você alterar esses valores, precisará recompilar todo o código dependente, ou seja, executar uma compilação limpa.
Dependendo da natureza das constantes, elas podem ter levado a suposições incorretas pelos desenvolvedores. Se esses valores forem alterados, eles podem acionar um bug. Por exemplo, um conjunto de constantes pode ser escolhido para formar certos padrões de bits, por exemplo public static final int R = 4, W = 2, X = 1
. Se eles forem alterados para formar uma estrutura diferente R = 0, W = 1, X = 2
, o código existente boolean canRead = perms & R
ficará incorreto. E pense na diversão que resultaria Integer.MAX_VALUE
em mudar! Não há solução aqui, é apenas importante lembrar que o valor de algumas constantes é realmente importante e não pode ser alterado simplesmente.
Mas para a maioria das constantes alterá-las, tudo ficará bem desde que as restrições acima sejam consideradas. Uma constante é segura para mudar quando o significado, e não o valor específico, é importante. É o caso, por exemplo, de ajustáveis como BORDER_WIDTH = 2
ou TIMEOUT = 60; // seconds
ou modelos como API_ENDPOINT = "https://api.example.com/v2/"
- embora, sem dúvida, alguns ou todos eles devam ser especificados nos arquivos de configuração, e não no código.