viernes, 9 de septiembre de 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 ) {
nbsp;  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

No hay comentarios:

Publicar un comentario