java - que - patron iterator ventajas y desventajas
Iterador externo vs Iterador interno (3)
¿Qué es un iterador externo e interno en Java?
Se trata de quién controla la iteración .
Otros detalles están en esta pregunta ¿Cuáles son los beneficios de la interfaz del iterador en Java?
Encontré esta descripción :
Repetidores externos vs. internos
Iteradores externos: cuando la iteración está controlada por el objeto de colección, decimos que tenemos un iterador externo.
En idiomas como .net o Java, es muy fácil crear iteradores externos. En nuestra implementación clásica, se implementa un iterador externo. En el siguiente ejemplo, se usa un iterador externo:
// using iterators for a clloection of String objects:
// using in a for loop
for (Iterator it = options.iterator(); it.hasNext(); ) {
String name = (String)it.next();
System.out.println(name);
}
// using in while loop
Iterator name = options.iterator();
while (name.hasNext() ){
System.out.println(name.next() );
}
// using in a for-each loop (syntax available from java 1.5 and above)
for (Object item : options)
System.out.println(((String)item));
Iteradores internos: cuando el iterador lo controla tenemos un iterador interno
Por otro lado, implementar y usar iteradores internos es realmente difícil. Cuando se usa un iterador interno, significa que el código que se ejecutará se delega al objeto agregado. Por ejemplo, en los idiomas que ofrecen soporte para esto es fácil llamar iteradores internos:
collection do: [:each | each doSomething] (Smalltalk)
La idea principal es pasar el código para ser ejecutado en la colección. Luego, la colección llamará internamente el método doSomething en cada uno de los componentes. En C ++, es posible enviar el método doMethod como un puntero. En C #, .NET o VB.NET, es posible enviar el método como delegado. En java, se debe usar el patrón de diseño de Functor
. La idea principal es crear una interfaz base con solo un método (doSomething). Luego, el método se implementará en una clase que implemente la interfaz y la clase se pasará a la colección para iterar. Para más detalles ver el patrón de diseño de Functor
.
Iterador externo
Cuando obtienes un iterador y lo pisas, es un iterador externo
for (Iterator iter = var.iterator(); iter.hasNext(); ) {
Object obj = iter.next();
// Operate on obj
}
Iterador interno
Cuando pasa un objeto de función a un método para ejecutar sobre una lista, eso es un iterador interno
var.each( new Functor() {
public void operate(Object arg) {
arg *= 2;
}
});