Pq private static final e não apenas private final?

Bom dia a todos!

Sempre tive uma dúvida em relação aos modificadores private + static, ja procurei respostas mas não achei nada por enquanto.

Em muitos lugares vejo declaração de constantes privadas.
O que não entendo é, ja que é privada, porque declarar como static?

Obrigado!

http://www.guj.com.br/article.show.logic?id=121

Obrigado pelo link, mas continuo com a mesma dúvida.
Eu sei o que é static, sei que é compartilhado por todos e não necessita instanciar a classe para usá-lo.

Mas porque ter uma variável private + static ?? Somente a classe que possui essa variável pode acessá-la, então porque p static?

O Static na variável garante que o valor dela seja sempre o mesmo/único para todas as instâncias da classe.

O Private modifica a visibilidade, se for Private apenas a própria classe poderá acessar a variável.

São propósitos diferentes… não é necessário uma pra usar a outra…

Private = apenas as instancias da classe podem vizualizá-la.
Static = seu valor será único, ou seja sempre o mesmo.
Final = depois de incializada o seu valor não poderá mais ser modificado.

pelo que sei é pra isso que serve, mas como foi dito anteriormente, uma utilização independe da outra.

Oi Marcelo, obrigado pela resposta, mas vc não me entendeu.

Eu sei o que faz o private e o que faz o static.

O que não entendo é porque declarar uma variável privada e estática ao mesmo tempo.
Uma variável estática é única e pode ser acessada de qualquer classe desde que ela seja public .
Sendo private somente a classe que a possui pode acessá-la, sendo assim, porque ser estática se ninguém mais tem acesso a esta variável?

Balena, obrigado!

Só uma coisa, com static o valor não será único, o valor pode ser alterado, o que é únicp é o membro, que independe de instâncias.

Mais uma vez, minha dúvida é qual é o sentido de utiliza a combinção de private + static, sendo que apenas a classe que possui o membro private pode acessá-lo.

O sentido é ter uma varíavel (ou objeto) com seu valor compartilhado por todos os objetos dessa classe. Sem que seja possível acessar essa varíavel de outras classes.

Essa abordagem é utilizada quando você quer ter uma varíavel static onde não é interessante que fique sendo pública também. Assim você oculta detalhes da implementação da classe à outras classes.

Pq eu quero uma variável que é única pra quem quer que queira obter o seu valor, se apenas a classe que a declara é quem tem acesso a mesma?

Será que melhorei a pergunta agora?

Diego, mas para isso eu a declaro apenas como private, não é necessário o static.

[quote=danilocsf]Pq eu quero uma variável que é única pra quem quer que queira obter o seu valor, se apenas a classe que a declara é quem tem acesso a mesma?

Será que melhorei a pergunta agora?[/quote]

Eu entendi a pergunta, mas você não entendeu as “possibilidades” do uso do static…

A variável static será única para todas as instâncias dessa classe, ou seja, se eu criar 200 instâncias de uma determinada classe, o valor será o mesmo para as 200.
Se eu alterar, vai “alterar” nas 200 instâncias…

Não consigo pensar num exemplo pra isso agora, mas é isso aí… agora, não tem nada a ver mas só pra complementarn se você quer uma variável que não mude de valor nunca, aí usamos o final

Entendeu?
Private, só acessível pela própria classe…
Static, valor único para a classe (e suas ‘n’ instâncias)…
Final, valor imutável…

[quote=danilocsf]Balena, obrigado!

Só uma coisa, com static o valor não será único, o valor pode ser alterado, o que é únicp é o membro, que independe de instâncias.

Mais uma vez, minha dúvida é qual é o sentido de utiliza a combinção de private + static, sendo que apenas a classe que possui o membro private pode acessá-lo.

[/quote]

Eu não disse que o valor dela não pode ser alterado, e sim o valor é único, porque todas as instâncias da classe tem o mesmo valor.

O private está sendo usado para que ninguém consiga ver de fora, e o static para garantir que todas as instancias da classe vejam a mesma coisa, quando olharem para essa variável.

O duro é que todos os exemplos que penso para vc utilizar isso e enxergar as diferenças entre o static e o non-static, envolvem o singleton, que permite apenas uma instância de classe.

Mas é mais ou menos como fazer uma implementação de uma classe de conexão toda errada, quando eu quiser eu altero o valor da String de conexão e meu banco de dados para de funcionar sem mais nem menos.

Marcelo, agora vc disse algo que começou a fazer mais sentido.
Seria uma utilização ao se utilizar threads… se em algum momento uma instancia da thread alterar o valor, todas as outras passam a utilizar o novo valor.

Mas aí vem outra pergunta, e porque constantes privadas então? (private static final)
Essas não podem ter outro valor.

Vejo isso muito, tanto durante o dia a dia na empresa, quanto em materiais de exemplos.
por ex.:
private static final String VALOR_DE_UM_PROPERTIE=“key.properties”;

aí essa constante é utilizada para ler um valor de um propertie…
No meu ponto de vista , esse tipo de declaração está apenas aumentando o consumo de memória, pq não apenas :
private final String VALOR_DE_UM_PROPERTIE=“key.properties”;

[quote=danilocsf]Marcelo, agora vc disse algo que começou a fazer mais sentido.
Seria uma utilização ao se utilizar threads… se em algum momento uma instancia da thread alterar o valor, todas as outras passam a utilizar o novo valor.

Mas aí vem outra pergunta, e porque constantes privadas então? (private static final)
Essas não podem ter outro valor.

Vejo isso muito, tanto durante o dia a dia na empresa, quanto em materiais de exemplos.
por ex.:
private static final String VALOR_DE_UM_PROPERTIE=“key.properties”;

aí essa constante é utilizada para ler um valor de um propertie…
No meu ponto de vista , esse tipo de declaração está apenas aumentando o consumo de memória, pq não apenas :
private final String VALOR_DE_UM_PROPERTIE=“key.properties”;
[/quote]

O final é imutável, e eu posso querer alterar o valor da variável static.

Exatamente … e pq ter uma variavel private final e static , se é imutavel? Não seria apenas uma coisa a mais na memória ao carregar a aplicação?

[quote=danilocsf][quote=Balena]
O final é imutável, e eu posso querer alterar o valor da variável static.
[/quote]

Exatamente … e pq ter uma variavel private final e static , se é imutavel? Não seria apenas uma coisa a mais na memória ao carregar a aplicação? [/quote]

É nesse ponto que estou querendo chegar, pois até hoje eu só adotei como ‘padrão’ mas nunca entendi o porque…
Em que situação se deve utilizar a combinação private static final e qual situação se deve utilizar private final , sendo que o valor é imutável ?
Isso não acarreta apenas um maior consumo de memória? Imagine centenas de classes que possuem dezenas de variáveis private static final, será que não poderia ser apenas private final?

É exatamente isso que não entrou na minha cabeça ainda.
Pode haver 1000 instância de uma classe, mas pq uma constante estática declarada nessa classe?

[quote=danilocsf]Pq eu quero uma variável que é única pra quem quer que queira obter o seu valor, se apenas a classe que a declara é quem tem acesso a mesma?

Será que melhorei a pergunta agora?[/quote]

Eu uso o private quando quero isso mesmo… quando a classe que declara a varíavel é a única que pode manipulá-la/enxergá-la…

[quote=diego_qmota][quote=danilocsf]Pq eu quero uma variável que é única pra quem quer que queira obter o seu valor, se apenas a classe que a declara é quem tem acesso a mesma?

Será que melhorei a pergunta agora?[/quote]

Eu uso o private quando quero isso mesmo… quando a classe que declara a varíavel é a única que pode manipulá-la/enxergá-la…[/quote]

Então Diego, a questão não é só o private … da uma lida no que escrevi logo antes de vc responder pra vc entender onde quero chegar.
Valeu a atenção!

[quote=danilocsf][quote=danilocsf][quote=Balena]
O final é imutável, e eu posso querer alterar o valor da variável static.
[/quote]

Exatamente … e pq ter uma variavel private final e static , se é imutavel? Não seria apenas uma coisa a mais na memória ao carregar a aplicação? [/quote]

É nesse ponto que estou querendo chegar, pois até hoje eu só adotei como ‘padrão’ mas nunca entendi o porque…
Em que situação se deve utilizar a combinação private static final e qual situação se deve utilizar private final , sendo que o valor é imutável ?
Isso não acarreta apenas um maior consumo de memória? Imagine centenas de classes que possuem dezenas de variáveis private static final, será que não poderia ser apenas private final?

É exatamente isso que não entrou na minha cabeça ainda.
Pode haver 1000 instância de uma classe, mas pq uma constante estática declarada nessa classe? [/quote]

Porquê se você usar private final, o consumo de memória será = 1000 X variavel.
Usando private static final, o consumo de memória será = variavel.

Vou dar alguns exemplos para ilustrar:

Você possui a classe Padeiro, onde o sindicato deles é igual para todos os objetos.
Aí você pode usar public static final… beleza? O sindicato é uma informação que pode ser visualizada em outras partes da aplicação e pode ser necessária na impressão de fichas de cadastro, etc…

Você têm a classe RemuneracaoPadeiro
Nela, você têm uma varíavel de base salarial que seja igual para todos os funcionários.

Mas para você não é interessante que a base salarial seja visível no resto do programa. Para que deixar isso visível se o programa só quer obter o cálculo do salário do cara e pronto. A forma que esse cálculo vai ser feito pouco importa para o resto da aplicação… A aplicação é cliente dessa classe, como cliente só importa a obtenção do resultado (sem que seja visível detalhes da implantação)…
E se eu usar private final para essa varíavel, se houverem 1000 objetos RemuneracaoPadeiro ele vai consumir 1000 vezes mais memória para essa varíavel (vão ter 1000 cópias dela na memória).

É o mesmo que você ser cliente de uma empresa e ao comprar um produto, ela te informar na nota: o centro de distribuição, quanto foi pago de imposto na fonte, qual foi a transportadora que fez a entrega, o horário que o produto foi entregue na loja, quanto foi o preço de atacado que a loja pagou, quanto custou a embalagem do produto, etc etc… O private é usado para ocultar de quem faz uso da classe, todos os detalhes da implementação.

O escopo que você vai usar para a variável segue a definição do uso da varíavel:

  • Essa varíavel deve ser enxergada fora do contexto da classe? É necessário para o resto da aplicação conhecer essa variável??
    Sim - Uso public
    Não - Uso private
  • A variável deve ser a mesma para todos os objetos da mesma classe?
    Sim - Uso static
    Não - Não uso static
  • A variável é imutável (ou só é mudada sazonalmente via alteração no código fonte)?
    Sim - Uso final
    Não - Não uso final

Você vai fazer uso só se for necessário que somente aquela classe tenha acesso a mesma e somente ela possa manipular/acessar a varíavel