Diego's weblog - Developer's notes

Todo | General | Design | Java
« Java 5. ¿Que tiene... | Main | Fast Lane Writer... »

20050909 viernes septiembre 09, 2005

Java 5. ¿Que tiene de bueno y de malo?. Parte IV

For/in

Este feature me parece interesante dado que facilita/optimiza la forma sobre la cual iterar por una collection o array, el código es más simple dado que elimina el uso de un iterator o variables índices pero esto genera algunas limitaciones que explicare mas adelante.
Aqui un ejemplo de for/in:

Collection<String> list = new ArrayList<String>();   // Generic
list.add("for/in");
list.add("annotations");
list.add("autoboxing");
 
// Conventional for
for( Iterator<String> iter = list.iterator(); iter.hasNext(); ) {
   String value = iter.next();;   // no-cast
   System.out.println( value );
}
 
// Enhanced for
for( String value : list ) {
   System.out.println( value );
}

Este nuevo for/in no nos da nada nuevo ya que se puede hacer lo mismo utilizando un for convensional. for/in puede hacer uso de Generics para de esta forma tambien evitar el casting, aunque esto no es un obligatorio.

Sintaxis.

for( Type identifier : Expression ) Statement

La expression debe ser un array o una instancia de la nueva interface java.lang.Iterable (java.util.Collection implementa java.lang.Iterable desde la version 5 de Java) que tiene el método public Iterator<T> iterator();. Esto permite crear clases que puedan ser iteradas utilizando el nuevo enhanced for. Type debe ser un tipo valida para Java (un objeto o un primitivo).
Basicamente lo que hace el for/in es traducirlo en un for convensional de la siguiente forma o siguiendo estos pasos:

for( Iterator iterator = Expression.iterator(); iterator.hasNext(); ) {
   Type identifier = (Type)iterator.next();
   Statement
}

A pesar de todo este feature tiene algunas consecuencias en su uso y por lo tanto genera limitaciones:
- No se puede modificar los valores de los elementos de un array de tipos primitivos.

int[] i = {1, 2, 3, 4, 5, 6};
for( int x : i ) {
   System.out.println(x);
   // No se modifica el valor del elemento en el array
   // aunque si se modifica dentro del bloque del for
   x++;
}

- No se puede eliminar elementos desde la collection, porque no se tiene el iterator.
- No se puede modificar la referencia de un objeto de la collecion dentro del loop, aunque se puede modificar el objeto en si mismo.

Collection list = new ArrayList();
list.add("for/in");
list.add("annotations");
list.add("autoboxing");
 
for( Object o : list ) {
   // Se modifica la referencia pero solo dentro del bloque for
   // No se modifica la collection
   o = new String("j2ee");
   System.out.println(o);
}

- No se puede utilizar para iterar simultaneamente varias collections o arrays en paralelo

( sep 09 2005, 10:40:03 AM ART ) Permalink Comentarios [1]

URL de la referencia: http://weblogs.javahispano.org/rdiegoc/entry/java_5_que_tiene_de3
Comentarios:

ok

Enviado por 172.26.0.66 en marzo 29, 2006 a las 11:36 AM ART #

Enviar un comentario:

Nombre:
Correo electrónico:
URL:

Su comentario:

Sintaxis HTML: Deshabilitado