Enumerator
Die "Enumerator"-Klasse stellt unter JavaScript einen Aufzählungstyp
zur Verfügung. Die Programmierschnittstelle ist in etwa eine Mischung
aus der des von Microsoft's JScript bereitgestellten Datentyps "Enumerator"
sowie der Java-Klasse java.util.Enumeration.
Es existieren drei Implementierungen der "Enumerator"-Klasse:
-
die erste, einfachste Variante nutzt die "LiveConnect"-Funktionalität
von Rhino und implementiert Funktionen als gleichnamige Methoden bzw. Datenfelder
über entsprechende get...- und set...-Methoden;
-
die zweite Variante implementiert ein Rhino "Host Object" und bedient sich
bei der Implementierung von Konstruktor, Methoden und Datenfeldern der
entsprechenden Namenskonventionen;
-
die dritte Variante erweitert das zuvor realisierte "Host Object" um eine
explizit implementierte Methode der "Scriptable"-Schnittstelle und
steuert so die Sichtbarkeit der eigenen Methoden und Datenfelder;
Alle Varianten bieten ungefähr dieselbe Funktionalität - Unterschiede
ergeben sich erst bei einer genaueren Untersuchung von "Enumerator"-Instanzen
unter JavaScript: während in der "LiveConnect"-Variante auch alle (von
java.lang.Object) eingeerbten Methoden und Datenfelder sichtbar sind, tauchen
in der ersten "Host Object"-Implementierung interessanterweise überhaupt
keine sichtbaren Datenfelder auf. Erst nach einer kleinen Erweiterung werden
die vom Objekt selbst bereitgestellten Slots (und nur diese) sichtbar.
Desweiteren unterscheiden sich die Varianten in der Art, wie sie unter Rhino
eingesetzt werden: die beiden "Host Object"-Klassen müssen unter JavaScript
erst mit "defineClass" angeschlossen werden (stehen anschließend
aber wie eine JavaScript-"Klasse" zur Verfügung), während auf die
"LiveConnect"-Implementierung direkt zugegriffen werden kann (wobei aber
stets die Java-Herkunft der Klasse deutlich wird).
Objektbeschreibung (JavaScript)
Konstruktor
-
new Enumerator (Elements)
-
erzeugt ein neues "Enumerator"-Objekt mit allen im JavaScript-Array
"Elements" enthaltenen Objekten. Diese werden in der (aufsteigenden)
Reihenfolge ihrer Indizes in die Aufzählung eingetragen - "Lücken"
(d.h. Elemente, die "null" oder "undefined" sind) werden
dabei ebenfalls übernommen;
Datenfelder
-
actualElement
-
enthält das "aktuelle" Aufzählungsobjekt - oder
"undefined", falls der interne Zeiger hinter dem letzten Element
der Aufzählung steht;
Methoden
-
atEnd () -> Boolean
-
prüft, ob der interne Zeiger hinter dem letzten Element der Aufzählung
steht - falls ja, liefert die Funktion den Wert true zurück,
ansonsten ist das Ergebnis false;
-
equals (Object) -> Boolean
-
prüft, ob das "Enumerator"-Objekt mit dem angegebenen Objekt
identisch ist bzw. diesem inhaltlich gleicht - falls ja, liefert die Funktion
den Wert true zurück, ansonsten ist das Ergebnis
false;
-
hasMoreElements () -> Boolean
-
prüft, ob die Aufzählung weitere Elemente enthält - falls
ja, liefert die Funktion den Wert true zurück, ansonsten ist
das Ergebnis false;
-
moveFirst ()
-
setzt den internen Zeiger auf das erste Element der Aufzählung;
-
moveNext ()
-
setzt den internen Zeiger auf das nächste Element der Aufzählung;
-
nextElement () -> Object
-
setzt den internen Zeiger auf das nächste Element der Aufzählung
und liefert dieses zurück. Falls die Aufzählung keine weiteren
Elemente mehr enthält, wird der interne Zeiger direkt hinter das letzte
Element gesetzt und ein "undefined" zurückgeliefert;
-
toString () -> String
-
liefert eine literale Repräsentaton des "Enumerator"-Objektes;
Objektbeschreibung (Java)
Für die Verwendung von anderen Java-Klassen aus stehen weitere Konstruktoren
und Methoden zur Verfügung - auf diese Weise wird insbesondere das Anlegen
neuer Aufzählungen vereinfacht.
Konstruktoren
-
new Enumerator ()
-
legt eine neue, leere Aufzählung an. Mithilfe von add und
addContents kann die Aufzählung mit Elementen gefüllt
werden;
-
new Enumerator (ItemArray)
-
legt eine neue Aufzählung an und trägt die Elemente des angegebenen
Feldes in der Reihenfolge aufsteigender (Feld-)Indices darin ein. Mithilfe
von add und addContents kann die Aufzählung um
zusätzliche Elemente erweitert werden;
Methoden
-
add (Item, [NullOrUndefinedAllowed])
-
fügt das angegebene Objekt als letztes in die aktuelle Aufzählung
ein - Felder werden dabei als ein Objekt eingetragen und nicht aufgelöst.
Das Hinzufügen von Objekten zu einer Auflösung ist jedoch nur
möglich, wenn diese noch unbenutzt ist oder (mittels moveFirst)
wieder zurückgesetzt wurde. Falls NullOrUndefinedAllowed angegeben
und als true definiert ist, werden auch Null und
Undefined als Argument akzeptiert und in die Aufzählung eingetragen
- anderenfalls wird eine Ausnahme geworfen (Voreinstellung für
NullOrUndefinedAllowed ist false);
-
addContents (ItemArray, [NullOrUndefinedAllowed])
-
fügt die Elemente des angegebenen Feldes in der Reihenfolge aufsteigender
(Feld-)Indices als letzte in die aktuelle Aufzählung ein - Elemente,
die ihrerseits ein Feld darstellen, werden nicht weiter aufgelöst, sondern
als ein Objekt in die Aufzählung ünernommen. Das Hinzufügen
von Objekten zu einer Auflösung ist jedoch nur möglich, wenn diese
noch unbenutzt ist oder (mittels moveFirst) wieder zurückgesetzt
wurde. Falls NullOrUndefinedAllowed angegeben und als true
definiert ist, werden auch Elemente mit dem Wert Null und
Undefined akzeptiert und in die Aufzählung eingetragen -
anderenfalls wird eine Ausnahme geworfen (Voreinstellung für
NullOrUndefinedAllowed ist false);
Verwendungshinweise (JavaScript)
Erzeugen eines neuen Aufzählungsobjektes
In den meisten Fällen dürften Aufzählungsobjekte das Ergebnis
eines Funktionsaufrufes sein (wie z.B. bei der Aufzählung aller lokalen
Dateisysteme). Bei Bedarf kann ein solches Objekt aber auch explizit erzeugt
werden:
var Enumeration = new Enumerator( new Array(1,2,3,4) );
Dem Konstruktur wird also ein Feld (Array) mit den aufzuzählenden Elementen
übergeben.
Verwendung eines Aufzählungsobjektes innerhalb einer Schleife
Der typische Anwendungsfall einer Aufzählung besteht in dem Durchlaufen
aller Elemente innerhalb einer for-Schleife:
for (; !Enumeration.atEnd(); Enumeration.moveNext()) {
passende Bearbeitung von Enumeration.actualElement
};
Mithilfe von moveFirst() kann eine teilweise oder vollständig
durchlaufene Aufzählung wieder auf das erste Element zurückgesetzt
und von dort aus erneut durchlaufen werden.
Anwendungsbeispiel (JavaScript)
Das Rhino-Skript EnumeratorTest.js verdeutlicht das Anlegen eines
Aufzählungsobjektes sowie dessen Verwendung. Zusätzlich werden
alle Slots des Aufzählungsobjektes angezeigt - so werden die Unterschiede
zwischen den beiden verfügbaren Implementierungen sichtbar.
Das Programm wird ohne Angabe von Kommandozeilen-Argumenten aufgerufen
java Rhino EnumeratorTest.js
und liefert - abhängig von der verwendeten Implementierung - eine der
nachstehend beschriebenen Ausgaben.
"LiveConnect"-Implementierung
Die einfachste der drei Implementierungen nutzt Rhino's "LiveConnect"-Eigenschaft
für die Realisierung eines Aufzählungstyps unter Java. Das zuvor
beschriebene Beispiel-Skript liefert folgende Ausgabe:
|