16.1.5 | Enumeration |
Enumeration ist nicht mit obigen Datenstrukturen, die durch Klassen repräsentiert werden, vergleichbar, wird aber trotzdem an dieser Stelle aufgeführt, da sie ebenso Zugriff auf Daten bietet. Enumeration ist ein Inferface, das dazu verwendet wird, eine Aufzählung von Elementen anzugeben. Dieses Interface wird z. B. von der Klasse StringTokenizer implementiert. Eine Klasse, die Enumeration implementiert, muss die folgenden Methoden überschreiben: Manche Methoden liefern als Ergebnis ein Exemplar dieses Interface, wie z. B. getApplets(). Über dieses Exemplar kann man auf die Elemente, die in der Aufzählung enthalten sind, zugreifen. Bei jedem Aufruf von nextElement() wird ein neues Element geliefert, bis alle Elemente der Aufzählung zurückgegeben wurden. Man kann auf eine Aufzählung also nicht wie bei einem Array oder der Klasse Vector über einen Index zugreifen, sondern muss ein Element nach dem anderen über nextElement() anfordern. Es ist nicht möglich, ein Element ein zweites Mal anzufordern.
Das folgende Beispiel zeigt, wie man Enumeration selbst implementieren kann:import java.util.Enumeration; import java.io.*; public class EnumerationDemo { static PrintWriter stdout = new PrintWriter(System.out,true); public static void main(String args[]) { // Überprüfung der Parameteranzahl if (args.length == 1) { try { // Divider mit der übergebenen Zahl initialisieren Divider d = new Divider(Integer.parseInt(args[0])); // Alle Teiler der Zahl ausgeben while(d.hasMoreElements()) stdout.println(( (Integer)d.nextElement()).intValue()); } catch(NumberFormatException e) { stdout.println("Error: "+e); } } else stdout.println("Illegal number of arguments"); } } class Divider implements Enumeration { // Zahl, deren Teiler ermittelt werden soll private int number; // Zähler, der einen möglichen Teiler darstellt private int value = 0; public Divider(int number) { // Zahl speichern this.number = number; } public boolean hasMoreElements() { // Ist der Zähler kleiner als die Zahl? if (value < number) // Dann sind noch nicht alle Teiler gefunden return true; else // Sonst sind alle Teiler gefunden return false; } public Object nextElement() { double div; do { // Sind noch nicht alle Teiler gefunden? if (value < number) // Zähler value++; // Zahl durch möglichen Teiler dividieren div = (double)number / (double)value; } // Wenn kein Divisionsrest vorhanden ist // oder der mögliche Teiler gleich der Zahl ist, // wurde ein Teiler gefunden while (((div - Math.floor(div)) != 0) && (value < number)); return new Integer(value); } }Die Klasse Divider erlaubt dem Benutzer den Zugriff auf die Teiler einer Zahl. Die Zahl, deren Teiler gesucht wird, übergibt man dem Konstruktor. Sind noch nicht alle Teiler zurückgeliefert, liefert hasMoreElements() true, durch Aufruf von nextElement() wird ein weiterer Teiler zurückgegeben.