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