Foreach vs Iterator

Nós ú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.

This entry was posted in dica, java. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>