Preciso inicializar uma variável na declaração quando for final?

16 respostas
E

Estou estudando sobre modificadores e encontrei a seguinte afirmação:

Fiz alguns testes, mas dá erro de compilação.

Obrigado

16 Respostas

B

Atributos final, podem ser inicializados 2 maneiras:

1-) Na declaração

2-) Dentro do construtor.

Como esta fazendo?

B

Variáveis final podem ser atribuídas somente uma vez.

Ou você faz junto com a declaração (inline):

final String URL_GUJ = "http://www.guj.com.br/";Ou após a declaração:

final String URL_GUJ; URL_GUJ = "http://www.guj.com.br/";
Se o compilador detectar que é possível mais de uma atribuição, então ele vai falhar.

sowyer

isso .... vc pode apenas inicializar ( se quiser ), na declaração. Caso não o faça, não terá problemas, mas quando vc atribuir algum valor a ela, o mesmo não poderá ser modificado....

.  
 .  
 final int a = 0;  
   
 void metodo() {  
   a = 1; // erro  
 }  
 .  
 .
.  
 .  
 final int a;  
   
 void metodo() {  
   a = 1; // ok, inicializou  
   a = 2; // erro, não é permitido alterar  
 }  
 .  
 .
B

Qual o erro que esta tendo?

Esta correto.

Lavieri

extamente como o btafarelo falou...

ou vc faz assim

public class Inscricao {

    public final String inscricao;

    public Inscricao(String inscricao) {
        this.inscricao = inscricao;
    }
}
ou assim
public class Inscricao {

    public final String inscricao = "111234";

    public Inscricao() {
    }
}
não inicializar da erro... por exemplo o código abaixo não compila
public class Inscricao {

    public final String inscricao;

    public Inscricao() {
    }
}
Lavieri
sowyer:
isso .... vc pode apenas inicializar ( se quiser ), na declaração. Caso não o faça, não terá problemas, mas quando vc atribuir algum valor a ela, o mesmo não poderá ser modificado....
.  
 .  
 final int a;  
   
 void metodo() {  
   a = 1; // ok, inicializou  
   a = 2; // erro, não é permitido alterar  
 }  
 .  
 .

vc não pode declarar uma variavel de classe final e não inicializar ... ou vc faz dentro do construtor, ou faz na declaração...

vc pode fazer isso dentro de métodos

por exemplo

public void meuMetodo() {
		final int constante;
		if (isOK())
			constante = 7;
		else
			constante = 12;
		System.out.println(constante*33);
		constante = constante + 12; // <---- isso não é permitido o resto do código esta ok
	}
E

certo eu entendi, acontece que eu estava declarando final static. Aí sim, ele só aceita na declaração. Por que ?

B

Se o atributo for static quer dizer que o atributo será o mesmo para todas as instâncias certo?

Então ele tem que subir com a primeira instância para memória, e por isso só pode ser ali, porque senão, toda vez que você executar o método o valor estaria sendo definido.

Lavieri

c vc precisar de escopo para criar o valor vc pode fazer assim

public static final String CONSTANTE_DEFINIDA_EM_ARQUIVO; public static final String LOAD; static { try { CONSTANTE_DEFINIDA_EM_ARQUIVO = recuperaOValorDaConstanteDoArquivo(); LOAD = "sucesso"; } catch (Exception ex) { CONSTANTE_DEFINIDA_EM_ARQUIVO = "uma msg padrao"; LOAD = "fracasso"; } finally { umMetedoQueFechaOArquivo(); } //Ps.: todos os metodos aqui tem q ser estaticos, se forem da mesma classe ^^ }

Lavieri

Outra observação é.... static é como o btafarelo falou....

quando um atributo é statico quer dizer que ele não é um atributo dentro da instancia, e sim ele é o mesmo para todas as instancias da mesma classe

por exemplo

public class Teste {
    private static msg = "";
    Teste(String msg) { Teste.msg = msg; }
    public String getMsg() { return msg; }
}
c vc fizer assim
Teste a = new Teste("se vc pensa");
Teste b = new Teste("que cada classe");
Teste c = new Teste("vai ter sua propria msg");
Teste d = new Teste("então vc esta");
Teste e = new Teste("redondamente enganado");

System.out.println(a.getMsg() );
System.out.println(b.getMsg() );
System.out.println(c.getMsg() );
System.out.println(d.getMsg() );
System.out.println(e.getMsg() );

//toda as linhas imprimirão "redondamente enganado", pois msg é um campo statico e serve a todas as classes.
E

Mas assim, o construtor tb é chamado quando a classe é carregada, então por isso imagine que poderia fazer isso:

public class Exemplo
{
   static final int x;

     public Exemplo()
    {       
        x = 5;
     } 
}
M
efcjunior:
Mas assim, o construtor tb é chamado quando a classe é carregada, então por isso imagine que poderia fazer isso:
public class Exemplo
{
   static final int x;

     public Exemplo()
    {       
        x = 5;
     } 
}
E se nenhuma instância da classe for criada? Se eu simplesmente fizer isso:
System.out.println(Exemplo.x);
???
E

quando eu faço por exemplo: Exemplo.x, construtor não é invocado ?

M

Não. Tanto que interfaces podem ter constantes (e interfaces nunca são instancidas).
Por exemplo:

SwingConstants.CENTER; // não é possível instanciar uma interface
E

valeu galera, obrigado, esclareceram muita coisa !

Lavieri

efcjunior:
valeu galera, obrigado, esclareceram muita coisa !

^^ so declare final quando realmente for uma constante… se o seu medo é de so inicializar a variável quando ela for chamada, isso já acontece, nada vai pra memoria ate que alguem chame por Exemplo.x, so a partir dai, a JVM aloca o valor do “x” da classe Exemplo na memoria ^^

Criado 14 de janeiro de 2009
Ultima resposta 14 de jan. de 2009
Respostas 16
Participantes 6