Duvidas Com Static

7 respostas
jingle

bom estou tendo problema na minha aplicação… então bolei uma classe que simula meu problema pra ve se vocês conseguem me ajudar…

public class classeEstatica {

	public static String stringStatica1 = classeEstatica2.getStringStatica3();
	public static String stringStatica2 = "stringStatica2";
	
	public static String getStringStatica1(){
		return stringStatica1;
	}
	
	public static void setStringStatica1(String novoStringStatica1){
		stringStatica1 = novoStringStatica1;
	}
	
	
	public static String getStringStatica2(){
		return stringStatica2;
	}
	
	public static void setStringStatica2(String novoStringStatica2){
		stringStatica2 = novoStringStatica2;
	}
	
	
	
	
	public static void main(String... args){
		System.out.println(classeEstatica.getStringStatica1());
		System.out.println(classeEstatica.getStringStatica2());
		
		classeEstatica2.setStringStatica3("stringStatica3 MODIFICADA");
		classeEstatica.setStringStatica2("stringStatica2 MODIFICADA");
		
		System.out.println(classeEstatica.getStringStatica1());
		System.out.println(classeEstatica.getStringStatica2());		
		
		
	}
	
}


class classeEstatica2 {
	public static String stringStatica3 =  classeEstatica.getStringStatica2();
	
	public static String getStringStatica3(){
		return stringStatica3;
	}
	
	public static void setStringStatica3(String novoStringStatica3){
		stringStatica3 = novoStringStatica3;
	}
	
}

duvidas…
sempre que eu chamar o “classeEstatica.stringStatica1;” no meu código ele vai pegar de novo o valor do “classeEstatica2.getStringStatica3();” ? (pelos meus teste vi que não, como faria pra ele sempre pegar de novo? )

se ao invez do:

public static String stringStatica1 = classeEstatica2.getStringStatica3();

eu colocasse o:

public static String stringStatica1 = classeEstatica2.stringStatica3;

ele manteria referencia?

e a ultima e mais importante
como faço pra ele "recriar " todas variaveis estatica da classeEstatica?

7 Respostas

Lavieri
duvidas... sempre que eu chamar o "classeEstatica.stringStatica1;" no meu código ele vai pegar de novo o valor do "classeEstatica2.getStringStatica3();" ? (pelos meus teste vi que não, como faria pra ele sempre pegar de novo? )

realmente não, não vai buscar sempre...

não sei bem o que vc ker com isso ... mais vc pode fazer assim...

class classeEstatica2 {   
    //private static String stringStatica3 =  classeEstatica.getStringStatica2();  <== vc não precisa disso, já que quer q sempre seja o valor da outra...
       
    public static String getStringStatica3(){   
        return classeEstatica.getStringStatica2(); 
    }   
       
    public static void setStringStatica3(String novoStringStatica3){   
        classeEstatica.setStringStatica2(novoStringStatica3);
    }
}

pronto agora acessa pelos gets... e ta feito o alias...

T
public static String stringStatica3 =  classeEstatica.getStringStatica2();

equivale a isto aqui:

public static String stringStatica3;
    static {
        stringStatica3  =  classeEstatica.getStringStatica2();  
    }

E como se sabe, um bloco static é executado apenas uma vez (durante o carregamento da classe.).

jingle

só pra esclareser melhor …

meu problema é o seguinte, eu configuro e obtenho propriedade dentro do “ava.lang.System”, e armazeno em variaveis estatica,

só que a minha classe que tem essas variaveis estatica foi chamada antes da hora (varios códigos estaticos desencadiados chamaram ela) e uma dessas minhas propriedade ainda não tinha sido configurada no System, ou seja depois quando eu for configurar ela no System já vai ter sido tarde…

entao eu preciso que ele “reecrie” elas…

achei que por ser estatico sempre que eu chama-se a variavel ele ia executar seu código de criação… mas pelo visto não é feito isso =/

T

Sei, estou sabendo.
O correto é usar um método, não uma variável estática - como é uma variável, ela não executa código, oras bolas!
Esse método deve acessar alguma coisa com o valor mais atualizado.

Lavieri

como disse o thingol…

é por isso que se acessa variáveis via gets e se modifica via sets… assim o get, vai saber como recuperar corretamente o valor da variável…

o que se pode acessar diretamente são os valore ditos “final” pois estes apos seu valor assumido nunca serão trocados, não fazendo diferença acessar o valor direto, ou acessar via get…

vc terá que refatorar para obter o valor correto… se vc usar IDE, acho que a melhor forma de corrigir o problema é… passo 1 … poem a variável estatica como private… ai todas as classes que usam ela, vão gerar um problema e ficar com 1 xiszinho vermelho… ai v entra nela e troca o valor da veriável pelo get

boa sorte

T

Hum… uma vez um carinha aqui na empresa resolveu acreditar nessa história de “final” e acabou tomando na cabeça. O “final” ficou “final” demais e deu problemas.
Ele fez a seguinte coisa:

a) Ele criou uma classe de configuração onde os valores configurados o foram usando “public static final”. É realmente nojento, mas ele achou que fosse uma boa idéia. (De boas idéias está cheio o inferno… )
b) A seguir, ele compilou os programas dele com essa classe.
c) Depois, ele precisou mudar algumas configurações. Ele simplesmente alterou só essa classe, sem recompilar o resto, e então copiou só o .class pro servidor.

O resultado final é que os programas simplesmente “ignoraram” as novas configurações, e ele teve de refazer uma boa parte do sistema para usar getters em vez de puxar diretamente os campos “public static final”. É que quando o Java compila alguma coisa, ele pega os valores “public static final” e os considera como imutáveis. Só recompilando tudo de novo é que ele pega os valores novos.

Lavieri

ui essa eu não sabia, e agora fiquei com uma duvida…

c mesmo um valor Final, pode ser setado apenas em runtime, como é possivel ele importar no momento de compilação ?

por exemplo

public static final String TESTE = Repositories.findById(Pessoa.class,12).getNome();

como seria capaz de dar import nisso em momento de compilação ??

Criado 1 de abril de 2009
Ultima resposta 1 de abr. de 2009
Respostas 7
Participantes 3