2008-10-22 7 views

Répondre

8

J'ai trouvé ce description:

externes contre itérateurs internes.

Iterators externes - lorsque l'itération est contrôlée par l'objet de collection, nous disons que nous avons un Iterator externe.

Dans des langages comme .net ou java, il est très facile de créer des itérateurs externes. Dans notre implémentation classique, un itérateur externe est implémenté. Dans l'exemple suivant un itérateur externe est utilisé:

// 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)); 

itérateurs internes - Lorsque le contrôle iterator il nous avons un itérateur

De l'autre côté mise en œuvre et l'utilisation d'itérateurs internes est vraiment difficile. Lorsqu'un itérateur interne est utilisé, cela signifie que le code à exécuter est délégué à l'objet agrégé. Par exemple dans les langues qui offrent un soutien pour c'est facile d'appeler itérateurs internes:

collection do: [:each | each doSomething] (Smalltalk) 

L'idée principale est de passer le code à exécuter à la collection. Ensuite, la collection appellera en interne la méthode doSomething sur chacun des composants. En C++, il est possible d'envoyer la méthode doMethod en tant que pointeur. En C#, .NET ou VB.NET, il est possible d'envoyer la méthode en tant que délégué. En Java le modèle de conception Functor doit être utilisé. L'idée principale est de créer une interface de base avec une seule méthode (doSomething). Ensuite, la méthode sera implémentée dans une classe qui implémente l'interface et la classe sera passée à la collection pour itérer. Pour plus de détails, voir le motif de conception Functor.

17

externe Iterator

Lorsque vous obtenez un itérateur et l'étape au-dessus, qui est un itérateur externe

for (Iterator iter = var.iterator(); iter.hasNext();) { 
    Object obj = iter.next(); 
    // Operate on obj 
} 

itérateur

Lorsque vous passez un objet de fonction à une méthode pour exécuter plus une liste, c'est-à-dire un itérateur interne

var.each(new Functor() { 
    public void operate(Object arg) { 
    arg *= 2; 
    } 
}); 
+1

Puisque Java 5 est le mode d'utilisation préféré un itérateur externe, serait d'utiliser la boucle for-each: * pour (Object o: var) {// NOOP} * bien que ce soit simplement du sucre syntaxique pour l'itérateur explicite utilisant la version. – Alex

+1

@JohannZacharee n'est pas foreach loop considéré comme un Iterator interne, puisque nous n'avons pas le contrôle sur l'itérateur? – denis631

+1

@ denis631 Oui, je suis d'accord avec le fait que la boucle foreach fonctionne comme un itérateur interne. Je ne l'ai pas utilisé comme exemple car je crois comprendre que Java les convertit en un itérateur externe au moment de la compilation. J'ai choisi un exemple fonctionnel pour illustrer plus clairement les différences. –

Questions connexes