terça-feira, 14 de agosto de 2012

Utilizando variável final no looping for-each


Uma questão interessante que poderá cair nos testes SCJP é em relação ao uso do for-each, incluído ao mundo Java a partir da versão 1.5. O uso deste recurso é extremamente simples. O caso interessante é quando trabalhamos com elementos finais em sua construção.
 
Bom, para usar o for-each, devemos iniciar o looping com um elemento (antes dos :) que guardará os elementos da coleção/array (após os :). Para ficar mais fácil, veja o código:
 
String values[] = new String[] { "a" , "b" , "c" };
for ( String temp : values ) {
  System.out.print( temp );
}
 
Veja que o vetor values[] contém três Strings. Para cada iteração do for, os elementos serão guardados em temp. Ou seja, na primeira iteração, temp é definido com "a", na segunda, com "b", e assim por diante.
O caso particular seria definir String temp como final. Veja o código:
 
String values[] = new String[] { "a" , "b" , "c" };
for ( final String temp : values ) {
  System.out.print( temp );
}
 
A primeira impressão é que esse código traría-nos um erro de compilação - supondo que final marcaria a temp com um valor imutável. Porém, a ideia é outra: quando definimos o elemento temp como final, indicamos que ele só poderá ser valorado com os elementos existentes no vetor values[]. Isso significa que o código abaixo traría um erro de compilação.
 
String values[] = new String[] { "a" , "b" , "c" };
for ( final String temp : values ) {
  System.out.print( temp );
  if ( temp.equals( values[0] ) ) temp = values[1];
}
 
Ao tentar definir um valor para temp (sendo final) fora do contexto declarativo do for-each, o programa iria gerar um erro de compilação indicando que temp só poderá ser atribuído com os valores existentes em values[]. O erro seria:
 
Test.java:7: variable temp might already have been assigned
      if ( temp.equals( values[0] ) ) temp = values[1];
                                      ^
1 error
 
Apesar de muito simples, este é um caso que pode gerar dúvida - mais pelo fato da não utilização no dia-a-dia.

Referências:
 
 
Espero ter ajudado!
Guilherme Pontes

Nenhum comentário:

Postar um comentário