sobota 22. srpna 2009

Iterator vs. Enumerator

Pro procházení kolekcí lze v Axaptě využít dvě třídy - Iterator a Enumerator. Respektive, pro každou kolekci existuje specializovaný iterátor a enumerátor, např. SetIterator a SetEnumerator. Použití iterátoru vypadá takto:
SetIterator iterator = new SetIterator(set);
while (iterator.more())
{
    info(iterator.value());
    iterator.next();
}
…a enumerátoru takto:
SetEnumerator enumerator = set.getEnumerator();

while (enumerator.moveNext())
{
    info(enumerator.current());
}
Je best practice používat enumerátor namísto iterátoru. O tomto doporučení vím již dlouho, ale až tento týden jsem se dozvěděl jeden zásadní rozdíl: volání iterátoru totiž selže, pokud jsou iterátor a iterovaná kolekce na jiné vrstvě (ve smyslu klient/server). V takovém případě je vyhozena run-time výjimka s tím, že objekt iterátoru není inicializován. Enumerator s touto situací počítá a vznikne na stejné vrstvě jako kolekce. Procházení všech prvků kolekce umístěné na jiné vrstvě zas může být výkonnostní problém, ale to už je jiná kapitola… MSDN: ListEnumerator MSDN: ListIterator MSDN: MapEnumerator MSDN: MapIterator MSDN: SetEnumerator MSDN: SetIterator

Žádné komentáře:

Okomentovat