A Lista osztály Elem segédosztályát
el akarjuk rejteni a külvilág elől.
public class Lista { private Elem elso; private static class Elem { Object adat; Elem elozo, kovetkezo; Elem (Object adat, Elem elozo, Elem kovetkezo) { this.adat = adat; this.elozo = elozo; this.kovetkezo = kovetkezo; } } public void beszur (Object adat) { elso = new Elem(adat,null,elso); if (elso.kovetkezo != null) elso.kovetkezo.elozo = elso; } public void torol (Object adat) { Elem elem = keres(adat); if (elem != null) torol(elem); } private void torol (Elem elem) { if (elem == elso) elso = elem.kovetkezo; if (elem.elozo != null) elem.elozo.kovetkezo = elem.kovetkezo; if (elem.kovetkezo != null) elem.kovetkezo.elozo = elem.elozo; } private Elem keres (Object adat) { for (Elem elem = elso; elem != null; elem = elem.kovetkezo) if (elem.adat.equals(adat)) return elem; return null; } }A teljes program: Lista.java |
A Lista osztály implementációjához szükséges
Felsorolo osztálynak hozzá kell férnie a
Lista osztály privát tagjaihoz.
public class Lista { ... private static class Felsorolo implements Iterator { final Lista lista; Elem aktualis; Elem torolheto = null; Felsorolo (Lista lista) { this.lista = lista; aktualis = lista.elso; } public boolean hasNext () { return aktualis != null; } public Object next () throws NoSuchElementException { if (aktualis != null) { torolheto = aktualis; Object adat = aktualis.adat; aktualis = aktualis.kovetkezo; return adat; } else { throw new NoSuchElementException(); } } public void remove () throws IllegalStateException { if (torolheto != null) { lista.torol(torolheto); torolheto = null; } else { throw new IllegalStateException(); } } } ... public Iterator felsorol () { return new Felsorolo(this); } }A teljes program: Lista.java |
A Felsorolo osztály a Lista osztály
nem statikus tagosztálya, ezért minden példánya a Lista
osztály valamely példányához van rendelve.
public class Lista { ... private class Felsorolo implements Iterator { Elem aktualis = elso; Elem torolheto = null; public boolean hasNext () { return aktualis != null; } public Object next () throws NoSuchElementException { if (aktualis != null) { torolheto = aktualis; Object adat = aktualis.adat; aktualis = aktualis.kovetkezo; return adat; } else { throw new NoSuchElementException(); } } public void remove () throws IllegalStateException { if (torolheto != null) { torol(torolheto); torolheto = null; } else { throw new IllegalStateException(); } } } ... public Iterator felsorol () { return new Felsorolo(); } }A teljes program: Lista.java |
Nem statikus tagosztály kiterjesztésekor a szülő konstruktorát
el kell látni befoglaló példánnyal, ha a kiterjesztés a szülőt
befoglaló osztályon kívül történik.
public class KulsoFelsorolo extends Lista.Felsorolo { public KulsoFelsorolo (Lista lista) { lista.super(); // ... } // ... }A teljes program: Lista.java, KulsoFelsorolo.java |
A Felsorolo osztály lokális osztályként definiálva.
public Iterator felsorol () { class Felsorolo implements Iterator { ... }; return new Felsorolo(); }A teljes program: Lista.java |
Valamilyen objektumon végrehajtandó műveletet absztraháló interfész.
public interface Muvelet { void vegrehajt (Object adat); }A teljes program: Muvelet.java |
Belső iterátor a Lista osztályban.
public class Lista { ... public void mindre (Muvelet muvelet) { for (Elem elem = elso; elem != null; elem = elem.kovetkezo) muvelet.vegrehajt(elem.adat); } }A teljes program: Lista.java |
A Muvelet osztály példányai túlélik a
multiplicitas metódus futását, és megjegyzik
a minta paraméter értékét.
static int multiplicitas (Lista lista, final Object minta) { class Szamlalo implements Muvelet { int n = 0; public void vegrehajt (Object adat) { if (adat.equals(minta)) n++; } } Szamlalo szamlalo = new Szamlalo(); lista.mindre(szamlalo); return szamlalo.n; }A teljes program: Pelda1.java |
A Felsorolo osztály névtelen osztályként definiálva.
public Iterator felsorol () { return new Iterator() { Elem aktualis = elso; Elem torolheto = null; public boolean hasNext () { return aktualis != null; } public Object next () throws NoSuchElementException { if (aktualis != null) { torolheto = aktualis; Object adat = aktualis.adat; aktualis = aktualis.kovetkezo; return adat; } else { throw new NoSuchElementException(); } } public void remove () throws IllegalStateException { if (torolheto != null) { torol(torolheto); torolheto = null; } else { throw new IllegalStateException(); } } }; }A teljes program: Lista.java |