2008-10-22 11 views

Antwort

8

ich diesen description gefunden:

Externe vs. interne Iteratoren.

Externe Iteratoren - wenn die Iteration durch das Sammlungsobjekt gesteuert wird, sagen wir, dass wir einen externen Iterator haben.

In Sprachen wie .net oder Java ist es sehr einfach, externe Iteratoren zu erstellen. In unserer klassischen Implementierung ist ein externer Iterator implementiert. Im folgenden Beispiel wird ein externer Iterator verwendet:

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

Interne Iteratoren - Wenn der Iterator sie kontrolliert haben wir einen internen Iterator

Auf der anderen Seite der Implementierung und Verwendung von internen Iteratoren wirklich schwierig ist. Wenn ein interner Iterator verwendet wird, bedeutet dies, dass der Code, der ausgeführt werden soll, an das Aggregatobjekt delegiert ist. Zum Beispiel in Sprachen, die Unterstützung für diese ist leicht zu interne Iteratoren rufen bieten:

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

Die Hauptidee ist, den Code zu übergeben, um die Sammlung durchgeführt werden. Dann ruft die Sammlung intern die doSomething-Methode für jede der Komponenten auf. In C++ ist es möglich, die Methode doMethod als Zeiger zu senden. In C#, .NET oder VB.NET ist es möglich, die Methode als Delegat zu senden. In Java muss das Designmuster Functor verwendet werden. Die Grundidee ist, eine Basisschnittstelle mit nur einer Methode (doSomething) zu erstellen. Dann wird die Methode in einer Klasse implementiert, die die Schnittstelle implementiert, und die Klasse wird zur Iteration an die Sammlung übergeben. Weitere Details finden Sie im Designmuster Functor.

17

Externe Iterator

Wenn Sie einen Iterator und Schritt darüber hinwegkommen, dass ein externer Iterator

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

Interne Iterator

Wenn Sie eine Funktion Objekt an eine Methode übergeben, überfahren eine Liste, das ist ein interner Iterator

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

Da Java 5 die bevorzugte Möglichkeit für die Verwendung ein externer Iterator, wäre es, die for-each-Schleife zu verwenden: * für (Object o: var) {// NOOP} *, obwohl es nur syntaktischer Zucker für den expliziten Iterator ist, der die Version verwendet. – Alex

+1

@JohannZacharee wird keine foreach-Schleife als Interner Iterator betrachtet, da wir nicht die Kontrolle über den Iterator haben? – denis631

+1

@ denis631 Ja, ich stimme zu, dass die foreach-Schleife ähnlich wie ein interner Iterator funktioniert. Ich habe es nicht als mein Beispiel benutzt, da ich verstehe, dass Java sie zur Kompilierzeit in einen externen Iterator konvertiert. Ich habe ein funktionelles Beispiel gewählt, um die Unterschiede besser zu veranschaulichen. –