• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Nazgulled

Constante estática, necessário?

10 mensagens neste tópico

Imaginem o seguinte código dentro de uma classe "Teste":

private static final int NOME_CONSTANTE = 1500;

O static é mesmo necessário?

Faz alguma diferença se eu criar várias classes do tipo "Teste" tendo lá o static ou não?

O que eu sei do static é que não precisamos de fazer "new Teste()" para aceder a constante (neste caso) mas tendo em consideração que a constante é privada, o static é necessário? Outra coisa que eu penso, mas não tenho a certeza é que se o static não estiver lá, cada classe criada vai gastar mais memória para cada constante por classe, mas se o static estiver lá, so gasta uma única vez para esse constante. Isto funciona assim ou nem por isso?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continuo com a mesma dúvida. Vou tentar explicar melhor... Imagina o seguinte código:

public class Program {
public static void main(String[] args) {
	Teste t1 = new Teste();
	Teste t2 = new Teste();
}
}

public class Teste {
private final int VARIABLE = 5;
}

  • Eu adicionei "final" à declaração da variável, mas se calhar ia dar ao mesmo. Tipo, o "final" irá apenas bloquear que o valor da variável seja alterado. Mas isso não significa nada, o que quero dizer é: independentemente de o "final" estar ali ou não, o valor da variável "VARIABLE" vai ter de ser guardado na memória, correcto?
  • Tendo em consideração que o ponto anterior é verdadeiro, quando eu crio o objecto "t1" e "t2", estou a alocar espaço na memória para a variável "t1.VARIABLE" e "t2.VARIABLE". Correcto?
  • Agora imaginemos que eu adiciono um "static" antes do "final". Eu sei o que o "static" significa, significa que eu vou poder ler o valor da constante sem precisar de criar um objecto do tipo Teste, ou seja, posso fazer "Teste.VARIABLE" sem precisar de usar o "new"(claro que o terei que fazer para outras coisas).
  • Usando agora o exemplo de código acima mas com a adição do "static", o que é que significa? A) Vai ser alocado espaço tanto para ambas as variáveis, ou seja, "t1.VARIABLE" e "t2.VARIABLE". :D Vai ser alocado espaço apenas para a variável Teste.VARIABLE.
  • Se no ponto anterior a resposta correcta é a B, então isto significa que se eu tiver várias instâncias da mesma class (ao contrário de apenas duas como no exemplo), convém declarar constantes como "static", pois desta forma poupamos memória que ao contrário estaríamos a gastar, tantas alocações de memória teriam de ser feitas como quantas instâncias da classe existissem.

Não me consigo explicar melhor do que isto... Resumindo e tendo em conta que penso que quase todo o meu raciocínio esta correcto a minha dúvida está no ponto 4 em saber qual das hipóteses entre A ou B é que está correcta. Ou então uma possível hipótese C que eu não estou a ver...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O static não é para permitir ler o valor sem o new isso é uma interpretação errada embora verdadeira.

As variáveis ou constantes como é o caso de instância ou seja sem static não existem até quem um objecto seja criado e variam de valor de objecto para para objecto embora no teu caso isso não aconteça podes ter t1.VARIABLE = 10 e t2.VARIABLE = 100 já que estas variáveis existem nos objectos e cada objecto é único.

Por outro lado as variáveis static são variáveis de classe e não dependem de objectos e o valor dessas variáveis vai ser sempre o mesmo para que objecto for.

Hum exemplo "parvo" mas que deve ajudar é tipo:

Imagina a planta de uma casa com paredes, portas, janelas, etc... com essa planta podes fazer X casas semelhantes mas com por exemplo cores diferentes ou seja vais criar objectos da classe, agora imagina que na planta tens o tamanho da casa esse tamanho vai ser sempre igual para todas as casas e vai existir mesmo se nenhuma casa for feita, por outro lado as janelas, portas, etc... só existem depois das casas feitas.

Não sei se foi um bom exemplo mas foi o que me ocorreu lol espero não te ter deixado mais confuso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há a parte de memoria sorry esqueci-me! Sim ao usares uma variável / constante de instanciá vais alocar espaço para cada objecto criado, com as variáveis / constantes de classe a alocação é feita apenas uma vez indiferente do numero de objectos criados.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites


(...)Tipo, o "final" irá apenas bloquear que o valor da variável seja alterado.
Não é bem assim, podes mudar o valor de uma variável final mas apenas uma vez, isto é, a palavra final quando aplicada a uma variável indica que a variável só pode ser iniciada explicitamente uma única vez. O que resulta em uma atribuição implicita e uma explicita, logo o resultado é que o valor da variável muda :D

Mas isso não significa nada, o que quero dizer é: independentemente de o "final" estar ali ou não, o valor da variável "VARIABLE" vai ter de ser guardado na memória, correcto?
Sim, qualquer variável, seja final, static, etc, precisa de um espaço em memória.
Tendo em consideração que o ponto anterior é verdadeiro, quando eu crio o objecto "t1" e "t2", estou a alocar espaço na memória para a variável "t1.VARIABLE" e "t2.VARIABLE". Correcto?
Nem por isso, neste caso e como a variável é um tipo primitivo, ao declarares as variaveis t1 e t2 é declarado espaço para o atributo VARIABLE mas caso esse atributo fosse um objecto então esse espaço não era reservado, seria apenas considerado quando a variável fosse instancida explicitamente através do operador new.
Agora imaginemos que eu adiciono um "static" antes do "final". Eu sei o que o "static" significa, significa que eu vou poder ler o valor da constante sem precisar de criar um objecto do tipo Teste, ou seja, posso fazer "Teste.VARIABLE" sem precisar de usar o "new"(claro que o terei que fazer para outras coisas).
Errado, não precisas usar o operador new porque a variável é do tipo primitivo e não é um objecto. Todos os objectos precisam ser intanciados através do operador new, mesmo os estáticos e o facto de acederes sem o usares não significa que não o tenhas de usar antes de lhe aceder. Normalmente os atributos estáticos que sejam objectos são iniciados na declaração ou em métodos estáticos.

A) Vai ser alocado espaço tanto para ambas as variáveis, ou seja, "t1.VARIABLE" e "t2.VARIABLE".
Não existem duas variáveis, existe apenas uma, neste caso acho que a resposta é obvia :), só vai ser criado espaço para uma.

:D Vai ser alocado espaço apenas para a variável Teste.VARIABLE.
O atributo VARIABLE é um atributo de classe, só existe uma classe, só existe um atributo, só para reforçar :D
Se no ponto anterior a resposta correcta é a B, então isto significa que se eu tiver várias instâncias da mesma class (ao contrário de apenas duas como no exemplo), convém declarar constantes como "static", pois desta forma poupamos memória que ao contrário estaríamos a gastar, tantas alocações de memória teriam de ser feitas como quantas instâncias da classe existissem.

Não é uma questão de poupar memória, poupar memória é apenas um efeito secundário que não tem importância, existem várias questões associadas ao uso de variáveis estáticas.

Um atributo estático é um atributo de classe, logo é partilhado por todas as instâncias da classe, isso significa que se uma instância altera o valor do atributo todas as restantes vão ver essa alteração.

Um atributo estático é iniciado quando for usado o método de acesso estático a qualquer atributo, método ou bloco estático dessa classe, isto é, se possuires 5 atributos estáticos e um método estático, se fizeres um acesso ao métodos, todos os atributos vão ser iniciados.

Se os atributos forem de tipos primitivos vão ser iniciados a zero caso não tenham uma iniciação explicita, ou ao valor dado pela iniciação explicita. Se forem objectos serão iniciados a null e não terão espaço de memória reservado, ou ao valor da iniciação explicita.

(...) Resumindo e tendo em conta que penso que quase todo o meu raciocínio esta correcto(...)

Não diria que esteja correcto, mas também não direi que está errado. No entanto existem muitas meias verdades no raciocínio e muitos pontos falaciosos que não estão correctos.

Resumido, o static depende do objectivo do atributo, se o objectivo é apenas uma constante partilhada por instâncias e que faz sentido existir apenas quando existe uma instância do objecto, então não precisas de usar a palavra e um simples atributo final com visibilidade public é suficiente, se por outro lado faz sentido que o atributo não precise de uma instancia, por exemplo o valor de PI numa classe de ajuda em questões matemáticas, então usa a palavra reservada static.

Uma nota, acho que não é o teu caso, mas a palavra static não define uma constante, define um atributo de classe. Constantes são definidas pela palavra final.

Embora não seja uma explicação muito profunda da palavra reservada static penso que possa ajudar, se surgirem mais dúvidas avisa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão-se a contradizer um bocado, mas acho que já percebi a ideia...

Thanks.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para concluir: tens de usar os dois (mesmo sendo privado). Apenas com final ele aloca sempre mais memória para a mesma constante.

Cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês estão-se a contradizer um bocado, mas acho que já percebi a ideia...

Thanks.

É capaz, não li bem a resposta do magician, mas vai por mim :D

Quanto a usar o dois, não tens de usar os dois, usas um ou outro ou a combinação conforme o objectivo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora