importjava.util.*;publicclassExample1203{publicstaticvoidmain(String[] args){Hashtable h =newHashtable();//Pflege der Aliase
h.put("Fritz","f.mueller@test.de");
h.put("Franz","fk@b-blabla.com");
h.put("Paula","user0125@mail.uofm.edu");
h.put("Lissa","lb3@gateway.fhdto.northsurf.dk");//AusgabeEnumeration e = h.keys();while(e.hasMoreElements()){String alias =(String)e.nextElement();System.out.println(
alias +" --> "+ h.get(alias));}}}
Naja, die Klasse soll ja keine Enumeration sein/bereitstellen..die nutzt ja einfach nur eine ?! Du benutzt ja auch manchmal eine ArrayList und schreibst List<...> list = ... ohne oben implements List zu schreiben oder? Ist das Selbe in grün. Oder benutzt den Iterator an diversen Stellen, da schreibste das ja auch nicht.
In HashTable gibt es dann z.B. eine innere/statische Klasse EmptyEnumerator o.ä. - dieser implementiert das Interface. Die HashTable gibt dann einfach nur diese Enumeration zurück bei keys(), und die Klasse Example1203 kann diese benutzen!
Ähm, dir ist aber schon klar, dass du dich da mit Fossilien beschäftigst? Statt Enumeration wird in allen moderneren APIs Iterator verwendet, statt Hashtable nimmt man HashMap, und inzwischen kann man selbiger auch Typparameter (a.k.a. Generics) mitgeben. Die alten Klassen Hashtable und Vector sind an die "neue" (na ja, auch nicht mehr ganz taufrische) Collection-Hierarchie nachträglich angepasst worden.
Im dritten Jahrtausend schreibt man
Java:
publicclassExample1203{publicstaticvoidmain(String[] args){Map<String,String> h =newHashMap<String,String>();//Pflege der Aliase
h.put("Fritz","f.mueller@test.de");
h.put("Franz","fk@b-blabla.com");
h.put("Paula","user0125@mail.uofm.edu");
h.put("Lissa","lb3@gateway.fhdto.northsurf.dk");//Ausgabefor(String alias : h.keySet()){System.out.println(
alias +" --> "+ h.get(alias));}}}
bzw. etwa effizienter (da wir ja sowieso Keys und Values brauchen):
Ehrlich gesagt war ich mir darüber nicht wirklich im Klaren. Welche Nachteile habe ich, wenn ich "Enumeration" und "Hashtable" im dritten Jahrtausend verwende?
Hashtable und Vector sind langsamer als HashMap und ArrayList (weil sie threadsafe ist, was du aber im Normalfall gar nicht brauchst). Im Prinzip spricht nichts weiter dagegen, sie trotzdem zu verwenden, dann solltest du aber nur die Standardmethoden der jeweiligen Interfaces Map und List verwenden, damit du flexibel bleibst. Z.B. rufst du in deinem Programm h.keys() aus, aber diese Methode gibt es nur in Hashtable, aber nicht in anderen Maps. Es wird also schwieriger, deine Map gegen eine andere auszutauschen (etwa gegen TreeMap, bei der die Schlüssel sortiert sind).
Enumeration wird einfach kaum noch verwendet. Iterator hat dieselbe Funktionalität (plus eine "optionale" Methode zum Löschen von Elementen), aber kürzere Methodennamen. Außerdem haben Listen einen erweiterte Klasse ListIterator, die z.B. auch rückwärts iterieren kann. Wenn du die "neue" for-Schleifen-Syntax mit dem Doppelpunkt verwenden willst, muss die entsprechende Klasse, über die du iterierst, das Interface Iterable implementieren, das wiederum einen Iterator (und keine Enumeration) zurückliefert.
Vielen Dank.
Etwas Java-Historie schadet nie und so habe ich doch mehr gelernt, als wie wenn ich mich nur mit den aktuellen Dingen beschäftige (auch wenn das in diesem Fall eher ein Zufall war). ;-)
Eine allgemeine Frage:
Wo kann mann eigentlich nachsehen - sofern das überhaupt öffentlich ist - wie die Methoden der API implementiert sind?