É constante ou não é constante? ? Utilização da palavra reservada ?final? (final keyword)

6 respostas
joaoorso

O código abaixo compila normalmente, pois o valor é atribuído a constante em sua declaração.

class Test {
    public static void main(String ... args){       
       int contador = 5;
       final int x = 5;
       final int y = 6;
       
       switch( 5 ){
          case x: contador++; break;          
          case y: ++contador;  break;              
          default: contador++; break;
       } 
       System.out.println(contador);
    }
 }

O código abaixo resulta em um erro de compilação na linha 10 ; mas como assim o erro não deveria ser na linha 06 ?
Como o compilador entende isso ?

class Test {
    public static void main(String ... args){          
       int contador = 5;
       final int x = 5;
       final int y ;
       y = 6;
       
       switch( 5 ){
          case x: contador++; break;          
          case y: ++contador;  break;              
          default: contador++; break;
       } 
       System.out.println(contador);
    }
 }

Obrigado a todos que ajudarem. :thumbup:

6 Respostas

christianovale

a palavra reservada ‘final’ quer dizer que o primeiro valor que for atribuido à variável será seu valor final.

na linha 6 voce definiu qual será o valor final da sua variável. (certo)

já na linha 10 voce tentou modificar o valor de uma variável do tipo final. (por isso dá erro)

joaoorso

christianovale:
a palavra reservada ‘final’ quer dizer que o primeiro valor que for atribuido à variável será seu valor final.

na linha 6 voce definiu qual será o valor final da sua variável. (certo)


Certo !

christianovale:

já na linha 10 voce tentou modificar o valor de uma variável do tipo final. (por isso dá erro)

Que variavel é essa ?
Pois (contador) não é do tipo final e é a única variável que está sendo modificada. Não é ?

Obridado :thumbup:

G

Achei isso:

A local variable (§14.4, §14.14) must be explicitly given a value before it is used, by either initialization (§14.4) or assignment (§15.26), in a way that can be verified by the compiler using the rules for definite assignment (§16).
http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.12.5

Mas também não entendi porque não está sendo entendido com “definite assignement”.

T

Isso é uma sutileza do Java que pode ser lida, se você souber língua de advogado, neste lugar:

http://java.sun.com/docs/books/jls/second_edition/html/defAssign.doc.html

Basicamente o que você fez em:

final int y;
y = 6;

foi o uso de um “blank final” e a inicialização desse “blank final” com o valor 6.

Entretanto, constantes usadas nos “cases” do switch não podem ser “blank finals”, por isso o erro ocorreu na linha 10, não na linha 6 (a inicialização nessa linha é perfeitamente válida, embora seja esquisita).

G

Fiz outros testes, e mesmo o código especificado na especificação não funciona:

void unflow(boolean flag) { final int k; if (flag) { k = 3; System.out.println(k); } else { k = 4; System.out.println(k); } }
http://java.sun.com/docs/books/jls/third_edition/html/defAssign.html#25979
adicionei no código desse método um “switch … case” e dá o mesmo erro.

joaoorso

Negócio esquisito né ! :?:
O pior é que isso é uma questão que encontrei em um simulado para SCJP.
Tomara que não caia questão desse tipo na prova, pois eu não entendi. :cry:

Se alguém tiver interesse em mais uma pergunta que não quer calar:
http://www.guj.com.br/posts/list/93491.java#501751

Abraços !

Criado 16 de junho de 2008
Ultima resposta 20 de jun. de 2008
Respostas 6
Participantes 4