Switch

Olá Pessoal,

Estou com dúvida no seguinte código.


	final int x = 5;
	final int y;
	y = 6;
	 
	switch( 8 ){
		case x:		// Compila
		case y:		// Não compila
	}

Porque essa pequena mudança da inicialização do y, faz com que o case com o y não compile??

Obs: O código acima é similar ao da página 184 do livro da Kathy, não consegui entender a explicação feita no livro.

Obrigado

Será q pq variaveis final não podem ser alteradas …

Aqui

Voce esta tentando atribuir num novo valor a variavel y … então da erro de compilação

Certo

Falowww

T+

E tambem ela precisa ser inicializada na declaração

Acredito que o motivo seja que as condições do switch precisa estar inicializadas e sem modificações.

Se criar variaveis nas condições do switch, precisam ser final(eu acho) para não terem o valor modificado ao decorrer do programa.

E precisam estar inicializadas para que o switch funciona, e o compilar saber quem são os valores das condições do switch.

Acredito que esse seja o motivo.

a) Dica: esse grau de sutileza não cai em provas. Eu mesmo achava que a primeira forma e a segunda fossem equivalentes.

b) Olhando a JLS 3.0 (Java Language Specification) você precisa saber um pouco de linguagem de advogado, desculpe, de gente que escreve especificações de linguagens, para poder entender porque é que a primeira forma é aceita (final int x = 5;) e a segunda (final int y; y = 6;) não é aceita. Tecnicamente, um label do “switch” (item 14.11) deve ser uma ConstantExpression, e pelo item 4.12.4 (“final variables”) uma variável final só é uma “ConstantExpression” se ela for inicializada com uma expressão constante.

Sendo curioso, aonde vc obteve essa informação?

Realmente, isso é muito sultiu para se saber, mas acredito que li em um dos materias que tenho para certificação que as condições do switch, precisa esta bem definida(ou constante ja inicializadas ou valores fixos), porisso ja imaginava que era isso.

blz…

http://java.sun.com/docs/books/jls/download/langspec-3.0.pdf

a galera, eu li o livro de kathy e a explicacao eh a seguinte:

No switch todos os valores das variaveis devem ser sabidos em tempo de compilacao (talvez pq nao eh permitido ter dois cases com o mesmo valor!) entao, a variavel x eh aribuida no momento da declaracao (o compilador sabe!) enquanto a variavel y tem o valor default de 0 (em tempo de compilacao! e que pode ser modificado jah que nao foi inicializado) e eh inicializada em tempo de execucacao! Dessa forma, o compilador nao tem como saber se dois cases tem valores iguais!

eu acho que eh isso!

flw galera!

o ponto principal de FINAL eh as variaveis deve ser inicializadas e inicializou o y na primeira linha, lembre-se dos valores padrao… se vc nao definir nada um valor int recebe 0.
o q vc fez de errado criou como padrao y e depois tentou alterar a variavel sendo q ela ta declarada como FINAL eh um valor constante… bom faça o seguinte tire o final e veja se no roda tranquilo?

valeu!

se tirar o final, não compila, devido que se tornara uma variavel que pode mudar de valor.

as condições do switch precisa ser conhecidas qdo compiladas, porisso que é necessário se no caso forem variaveis, elas serem final e estarem ja inicializadas.

blz…

bom esse conceito nao conhecia que deveria ser final, sei que switch nao string apenas valores int e outro q nao lembro… hehe ja fiz programas sem final e rodou… o problema q identifiquei q ele tentou alterar o valor de uma variavel final… o q na eh permitido…
eh vivendo e aprendendo hehe!

Ai galera… vamos juntar as respostas, pois todas estão corretas…

  1. Não se pode mudar o valor de uma constante (hehe), uma declaração com FINAL é uma constante, logo não se pode mudar seu valor;

  2. O switch não aceita nas comparações (no case) o uso de variáveis somente constantes, porém no “cabeçalho” do switch ele aceita, o que não é o nosso caso;

Assim para compilar este código a atribuição do valor ao y teria que ser na declaração…

Valeu galera e inté!!!

[quote=absolution]
a galera, eu li o livro de kathy e a explicacao eh a seguinte:

No switch todos os valores das variaveis devem ser sabidos em tempo de compilacao (talvez pq nao eh permitido ter dois cases com o mesmo valor!) entao, a variavel x eh aribuida no momento da declaracao (o compilador sabe!) enquanto a variavel y tem o valor default de 0 (em tempo de compilacao! e que pode ser modificado jah que nao foi inicializado) e eh inicializada em tempo de execucacao! Dessa forma, o compilador nao tem como saber se dois cases tem valores iguais!

eu acho que eh isso!

flw galera![/quote]

Olá absolution,

O código que eu coloquei é um código de um método, você disse que a variavel y tem o valor default de 0. Não seriam só as váriaveis de instancia que recebem valores default? Corrija-me se eu estiver errado.

Obrigado pela sua resposta.

[quote=camilolopes]o ponto principal de FINAL eh as variaveis deve ser inicializadas e inicializou o y na primeira linha, lembre-se dos valores padrao… se vc nao definir nada um valor int recebe 0.
o q vc fez de errado criou como padrao y e depois tentou alterar a variavel sendo q ela ta declarada como FINAL eh um valor constante… bom faça o seguinte tire o final e veja se no roda tranquilo?

valeu![/quote]

Olá Camilo,

O meu problema é na linha que está escrito “//Não compila” e não na atribuição “y = 6;”. Acho que variaveis locais não recebem valores defauts, somente variaveis de instâncias. Mas agora estou realmente na dúvida, você é a segunda pessoa nesse post que fala sobre isso.

E essa declaração abaixo é permitida, eu não preciso inicializar uam variavel final logo de quando a declaro, pode ser feita como abaixo.


   final int x;
   x = 6;

Obrigado

Abraços

[quote=thingol]a) Dica: esse grau de sutileza não cai em provas. Eu mesmo achava que a primeira forma e a segunda fossem equivalentes.

b) …

[/quote]

Valeu pela explicação técnina heheh

Abraços

Realmente estás correto quanto à declaração de variáveis em métodos…

Assim a explicação de “thingol” justifica o erro.

Falo!