Foreach vs Iterator
- java
Nos últimos dias tenho trabalhado bastante com coleções (collections) do java. Estava habituado a usar Iterator para varrer as coleções. Na versão do Java 5, houve a implementação do foreach para java que mudou a forma como iteramos sobre uma coleção.
Normalmente fazíamos da forma:
List<object> objects = new ArrayList<object>();
objects.add(obj1);
...
objects.add(objn);
Iterator<object> it = objects.iterator();
while (it.hasNext()) {
Object o = it.next();
// do something with the object 'o'
}
Quando precisamos realmente trabalhar com o objeto, precisamos de uma referência aquele objeto, caso contrário:
while (it.hastNext()) {
it.next().method1();
it.next().method2(); // could result exception
}
Neste caso it.next() lê o objeto corrente e incrementa um marcador para o elemento seguinte. Se usarmos o it.next() novamenete, estaremos trabalhando com outra referência, o que poderia ser um vazio ou um ponteiro nulo.
Por estes motivos a forma de iterar sobre coleções foi mudado para o foreach, que possui a seguinte implementação:
for (Object o : objects) {
// do something with the object 'o'
}
Na prática, quando compilamos o código o resultado do o foreach é o mesmo para a iteração do primeiro caso apresentado, onde criamos um marcador para referênciar o objeto da coleção lido. Usando o for-each trabalhamos de forma mais segura quando iteramos, resultando também num código mais legível, mantendo a tipagem sobre generics collections.
Se tiver dúvidas basta criar um código e compilá-lo.
Depois use o comando javap -c CompiledClass
note que não há extensão .class
Relembrando, o uso de foreach só é válido na versão do Java 5+
update
Uma observação que gostária de fazer é a seguinte, alguns programadores gostam de usar a seguinte codifição para iteração:
for (Iterator<object> it = objects.iterator(); it.hasNext(); ) {
Object o = it.next();
// do something
}
É uma opção de cada um, mas acredito que o uso do while fornece um legibilidade de código muito maior, o for ele tende a amontar muita informaçao numa unica linha o que prejudica a leitura. O resultado de compilação é o mesmo tanto para for como while, uma vez que o for é uma expansão para while, ou seja, durante o processo de compilação o bloco de código do for será convertido para o formato do while.