[RESOLVIDO] Objetos com membros estaticos

12 respostas
douglaskd

um objeto com membros estáticos só é criado no primeiro acesso à um membro estático ou no momento da compilação ?

Obrigado.

12 Respostas

Rodrigo_Sasaki

Tente elaborar um pouco melhor porque ficou meio confuso :slight_smile:

Em uma pergunta conceitual assim misturar objeto com estáticos gera muitas possibilidades, o que exatamente você quis dizer?

douglaskd
Rodrigo Sasaki:
Tente elaborar um pouco melhor porque ficou meio confuso :)

Em uma pergunta conceitual assim misturar objeto com estáticos gera muitas possibilidades, o que exatamente você quis dizer?

seu eu criar 100.000 classes com membros estaticos...

classe A {

  static texto = "aaaaa";

}

após eu compilar o projeto, e executar o programa todas elas seram criadas e ficaram disponiveis na memória, ou a JVM criará essas instancias após o 1° acesso de cada classe

obrigado.

main(){

System.out.println(A.texto) // o objeto A é criado neste momento, ou ja havia sido criado antes na hora da execução do programa ?

}
Rodrigo_Sasaki

Se você criar 100.000 instâncias da classe A, você só vai ter 1 atributo texto pois ele está relacionado à classe e não à instância em si.

Ele será carregado quando for criada a primeira instância de A. Em tempo de compilação, você não terá nada na memória.

Era isso que você estava perguntando?

douglaskd

Rodrigo Sasaki:
Se você criar 100.000 instâncias da classe A, você só vai ter 1 atributo texto pois ele está relacionado à classe e não à instância em si.

Ele será carregado quando for criada a primeira instância de A. Em tempo de compilação, você não terá nada na memória.

Era isso que você estava perguntando?

na verdade estou querendo provar uma teoria de que quanto menor uma classe com atributos estáticos, menor será o consumo de memória.

então se eu tenho 1 classe com 1000 atributos estáticos, é mais performático eu dividir esta em 100 classes diferentes, pois a criação do objeto na memória só ocorrerá quando 1 dos atributos da classe for acessada.

ou caso ocorra na execução então quer dizer que o consumo de memória seria o mesmo.

Hebert_Coelho
Pq vc não faz?
classe A {  
      System.out.println('asd');
      static texto = "aaaaa";  
      
    }

Assim você vai saber quando.

Hebert_Coelho

douglaskd:
Rodrigo Sasaki:
Se você criar 100.000 instâncias da classe A, você só vai ter 1 atributo texto pois ele está relacionado à classe e não à instância em si.

Ele será carregado quando for criada a primeira instância de A. Em tempo de compilação, você não terá nada na memória.

Era isso que você estava perguntando?

na verdade estou querendo provar uma teoria de que quanto menor uma classe com atributos estáticos, menor será o consumo de memória.

então se eu tenho 1 classe com 1000 atributos estáticos, é mais performático eu dividir esta em 100 classes diferentes, pois a criação do objeto na memória só ocorrerá quando 1 dos atributos da classe for acessada.

ou caso ocorra na execução então quer dizer que o consumo de memória seria o mesmo.

Cara, vc ta matando orientação a objeto. Não importa se uma classe com 1000 estáticos é mais rápido que 100 classes com 1 atributo. Seu projeto vai ser uma @(&#@(#. Vc deve programar primeiramente OO e depois ver a questão da performance.

Se você quer fazer o teste, Crie as 100 classes com 1 atribute e rode uai. Faça métricas.

douglaskd
Hebert Coelho:
douglaskd:
Rodrigo Sasaki:
Se você criar 100.000 instâncias da classe A, você só vai ter 1 atributo texto pois ele está relacionado à classe e não à instância em si.

Ele será carregado quando for criada a primeira instância de A. Em tempo de compilação, você não terá nada na memória.

Era isso que você estava perguntando?

na verdade estou querendo provar uma teoria de que quanto menor uma classe com atributos estáticos, menor será o consumo de memória.

então se eu tenho 1 classe com 1000 atributos estáticos, é mais performático eu dividir esta em 100 classes diferentes, pois a criação do objeto na memória só ocorrerá quando 1 dos atributos da classe for acessada.

ou caso ocorra na execução então quer dizer que o consumo de memória seria o mesmo.

Cara, vc ta matando orientação a objeto. Não importa se uma classe com 1000 estáticos é mais rápido que 100 classes com 1 atributo. Seu projeto vai ser uma @(*&#@(*#. Vc deve programar primeiramente OO e depois ver a questão da performance.

Se você quer fazer o teste, Crie as 100 classes com 1 atribute e rode uai. Faça métricas.

exato, estou unindo argumentos. um deles "pode" ser o consumo de memória.

olha montei um codigo:

public class Propagation {

	public static void main(String[] args) {
		
		System.out.println("a classe com membros statics ainda não foi criada ? ");
		
		System.out.println(poil.z);
	}
}

class poil{

	static {
		System.out.println("static block");
	}
	
	static int z = 8;
        static int y = 9;
}

eu queria saber algumas coisas ?

1 - a classe foi criada assim que eu chamei um de seus atributos ?
2 - todos os atributos foram parar na memória no momento da execução, ou na chamada ao atributo z ?
3 - quando acessei z, y foi criado e foi parar na memória, ou somente z ?

Hebert_Coelho

douglaskd:
exato, estou unindo argumentos. um deles “pode” ser o consumo de memória.
Sempre que vi problemas relacionados a performance com java foi por causa de loops, banco de dados, acessos externos, etc.

Nada ligado a ‘momento de criação’. Cara, vc ta procurando no lugar errado.

Boa sorte ai.

jcranky

Concordo com o Herbert, por favor não mate a OO tentando fazer otimização antes da hora.

Mas de qualquer forma, um atributo estático será carregado no primeiro uso da classe que o contém - qualquer tipo de uso, independente de acessar ou não o tal atributo.

douglaskd

jcranky:
Concordo com o Herbert, por favor não mate a OO tentando fazer otimização antes da hora.

Mas de qualquer forma, um atributo estático será carregado no primeiro uso da classe que o contém - qualquer tipo de uso, independente de acessar ou não o tal atributo.

será carregado somente o atributo acessado, ou todos os outros atributos da classe ?

[EDIT]
opa… li direito sua resposta.

então se eu usar de qualquer forma a classe, todos os atributos vão parar na memória…

então mesmo que não tão importante , é + um argumento para a divisão de responsabilidades de uma classe ou um Enum.

jcranky

Todos. Simplesmente declarar uma variável daquela classe já se classifica como “uso” dela.

Aluno aluno;

Isso já faria com que todos os atributos estáticos fossem carregados.

douglaskd

jcranky:
Todos. Simplesmente declarar uma variável daquela classe já se classifica como “uso” dela.

Aluno aluno;

Isso já faria com que todos os atributos estáticos fossem carregados.

Obrigado Hebert, Paulo e Rodrigo, dúvidas sanadas.

Criado 29 de maio de 2013
Ultima resposta 29 de mai. de 2013
Respostas 12
Participantes 4