[RESOLVIDO] Objetos com membros estaticos

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

Obrigado.

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?

[quote=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?[/quote]

seu eu criar 100.000 classes com membros estaticos…

[code]classe A {

static texto = “aaaaa”;

}[/code]

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.

[code]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 ?

}[/code]

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?

[quote=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?[/quote]

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.

Pq vc não faz?

[code] classe A {
System.out.println(‘asd’);
static texto = “aaaaa”;

}  [/code]

Assim você vai saber quando.

[quote=douglaskd][quote=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?[/quote]

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.
[/quote]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.

[quote=Hebert Coelho][quote=douglaskd][quote=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?[/quote]

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.
[/quote]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.[/quote]

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

olha montei um codigo:

[code]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;

}[/code]

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 ?

[quote=douglaskd]exato, estou unindo argumentos. um deles “pode” ser o consumo de memória.[/quote]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.

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.

[quote=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.[/quote]

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.

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.

[quote=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.[/quote]

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