You are on page 1of 7

Kollekciók (konténerek) Collections Kollekciók (folyt.

)
A konténer osztálykönyvtár egyike Containers  Példa:
a leghatékonyabb programozási eszközöknek public class PrintingContainers {
static Collection fill(Collection c) {
 Java 2-ben teljesen újratervezték (a Java 1.x c.add("dog");
c.add("dog");

verziókban nagyon gyengére sikeredett) c.add("cat");


return c;
}
 Két koncepció: static Map fill(Map m) {
m.put("dog", "Bosco");
– Kollekció (Collection): Egyéni elemek csoportja, m.put("dog", "Spot");
m.put("cat", "Rags");
általában valamilyen szabályossággal (listában }
return m;

sorrendiség, halmazban egyediség, stb.) public static void main(String[] args) {


System.out.println(fill(new ArrayList())); Output:
– Leképezés (Map): Kulcs-adat kettősök csoportja, a System.out.println(fill(new HashSet()));
System.out.println(fill(new HashMap())); [dog, dog, cat]
kulcsra gyors keresést biztosít } [cat, dog]
} {cat=Rags, dog=Spot}

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 146 2002. 04. 08. 147
© Ferenc Rudolf © Ferenc Rudolf

A konténerek hátránya Iterátorok Iterators


 Elveszítik a típust  Minden konténernek támogatnia kell az elemek
– Mindig Object-eket tárolnak hozzáadását illetve elérését (ez a dolga)
– Általános célú konténerek: Nem tárolhatnak  Pl. ArrayList esetében ez könnyű:
specifikus típusú objektumokat – add(); get()
 Bármi belerakható – nincs típusellenőrzés  Ennél általánosabb, absztraktabb megoldás kell
– Pl. egy macskákat tároló konténerbe nyugodtan bele – Generikus kódot szeretnénk írni, ami nem függ a
lehet tenni kutyákat (csak az Object referenciát teszi használt konténertől (ne kelljen újraírni)
bele)
A megoldás: Iterátorok használata
 Downcast-olni kell az elemet használat előtt!
Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák
2002. 04. 08. 148 2002. 04. 08. 149
© Ferenc Rudolf © Ferenc Rudolf
Iterátorok (folyt.) Iterátorok (folyt.)
z Egy iterátor egy objektum, ami végighalad egy  Példa:
import java.util.*;

objektumsorozaton anélkül, hogy a felhasználó class Hamster {


private int hamsterNumber;
programozó tudna róla, hogy milyen konkrét belső Hamster(int i) { hamsterNumber = i; }
public String toString() {
struktúrája van a konténernek return "This is Hamster #" + hamsterNumber;
}
z Java iterátor tudása: }
class Printer {
– Kérni lehet egy Iterator objektumot a konténertől az static void printAll(Iterator e) {
while(e.hasNext())
iterator() metódushívással System.out.println(e.next());
– Kérni lehet a következő elemet a next() metódussal
}
}
(a legelsőt is next()-tel kérjük!) public class HamsterMaze {
public static void main(String[] args) {
– Meg lehet kérdezni, hogy maradt-e még elem a sorozatban a ArrayList v = new ArrayList();
hasNext() metódussal
Output: for(int i = 0; i < 3; i++)
v.add(new Hamster(i));
– Törölni lehet az iterátorral lekért elemet remove()-val This is Hamster #0
This is Hamster #1 }
Printer.printAll(v.iterator());

This is Hamster #2 }
Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák
2002. 04. 08. 150 2002. 04. 08. 151
© Ferenc Rudolf © Ferenc Rudolf

Konténerek Collection (List, Set) funkcionalitása


- elem hozzáadása
 Osztályhierarchia z boolean add(Object)
z boolean
addAll(Collection) – elemek hozzáadása
Iterator Collection Map
Produces Produces z void clear() – töröl minden elemet
z boolean
ListIterator contains(Object) – true, ha tartalmazza az elemet
HashMap TreeMap z boolean
Produces
List Set
containsAll(Collection) – true, ha tartalmazza az elemeket
WeakHashMap z boolean isEmpty() – true, ha üres

Utilities
z Iterator iterator() – visszaad egy iterátort
ArrayList LinkedList HashSet TreeSet
Collections

Comparable Comparator Arrays

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 152 2002. 04. 08. 153
© Ferenc Rudolf © Ferenc Rudolf
Collection (List, Set) (folyt.) Lista List
z boolean
z List (absztrakt) – Elemeket tárol adott sorrendben
remove(Object) – elem törlése
z boolean – ListIterator – oda-vissza be lehet járni a listát és be lehet
removeAll(Collection) – minden elem törlése szúrni elemeket a listába elemek közé is
z boolean
retainAll(Collection) – csak akkor tartja meg az elemet, ha az
z ArrayList – Tömbbel megvalósított lista: Gyors
szerepel a paraméterben (metszetképzés) elemelérés de lassú beszúrás/törlés
– elemek száma
z int size()
z LinkedList – „Igazi” láncolt lista: Gyors
z Object[] toArray() – felépít egy tömböt, ami tartalmazza a
konténer elemeit beszúrás/törlés de lassú elemelérés. Plussz metódusok,
z Object[] hogy használható legyen stack-, queue- és deque-ként
toArray(Object[] a) – mint az előző, csak szűri típus szerint:
– addFirst(), addLast(), getFirst(), getLast(),
csak az a paraméterben kapott típusú
elemeknek megfelelő típusú elemekből removeFirst(), removeLast()
építi fel a tömböt
Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák
2002. 04. 08. 154 2002. 04. 08. 155
© Ferenc Rudolf © Ferenc Rudolf

Halmaz Set Map funkcionalitása


z Set (absztrakt) – Egyedi elemeket tárol sorrendiség z void clear() – töröl minden elemet
z boolean
nélkül containsKey(Object) – true, ha tartalmazza a kapott kulcsú
– A tárolt elemeknek definiálniuk kell az equals() metódust elemet
z boolean
z HashSet – Gyors keresést biztosító halmaz containsValue(Object) – true, ha tartalmazza a kapott tartalmú
– A tárolt elemeknek definiálniuk kell a hashCode() metódust elemet
z Set entrySet() – visszaadja halmazként a tárolt adatokat
z TreeSet – Rendezett halmaz
z Object get(Object key) – a kapott kulcsú elemet adja vissza
– first() – a legkisebb elem z boolean isEmpty() – true, ha üres
– last() – a legnagyobb elem z Set keySet() – visszaadja halmazként a tárolt kulcsokat
– subSet(from,to), headSet(to), tailSet(from) –
visszaadja a fának egy részét

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 156 2002. 04. 08. 157
© Ferenc Rudolf © Ferenc Rudolf
Map funkcionalitása (folyt.) Leképezés Map
z Object
put(Object key,
z Map (leképezés) – Kulcs-adat objektum-párok
Object value) – beszúr egy új elemet (párost) csoportja, a kulcsra gyors keresést biztosít
– beszúrja a kapott Map elemeit (másolás)
z
z
void putAll(Map)
Object
z HashMap – Hash-táblával implementált,
remove (Object key) – törli a kapott kulcsú elemet keresésre/beszúrásra optimalizálva
– elemek száma
z int size()
z TreeMap – Piros-fekete fával implementált,
z Collection values() – visszaadja kollekcióként a tárolt
elemeket rendezetten tárolja az elemeket
– firstKey() – a legkisebb kulcs
– lastKey() – a legnagyobb kulcs
– subMap(from,to), headMap(from),
tailMap(to) – visszaadja a fának egy részét

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 158 2002. 04. 08. 159
© Ferenc Rudolf © Ferenc Rudolf

Kivételkezelés Exception
handling
z Java alapfilozófia:
Rosszul formált kód nem fog futni
z Ideális lenne, ha minden hibát fordítási időben ki
Hibakezelés kivételekkel lehetne deríteni, de a valóságban nem így van
z Korábbi nyelvekben (pl. C-ben) a hibakezelés inkább
csak konvenció volt
– Tipikusan, a függvény visszaad egy hibakódot, vagy beállít
egy jelzőt, amit a hívó fél kell(ene), hogy ellenőrizzen
– Ez általában elmarad: pl. ki ellenőrzi le, hogy a printf() mit
ad vissza?

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 160 2002. 04. 08. 161
© Ferenc Rudolf © Ferenc Rudolf
Kivételkezelés (folyt.) Kivételek Exceptions
A megoldás: Nyelvi szinten beépíteni és z Kivételes feltétel: egy probléma, ami meggátolja a
megkövetelni a hibakezelést programfutást egy adott metódusban (blokkban)
z Egyszerű példa a null referencia: Érdemes leellenőrizni
 Nem a Java találmánya, már az 1960-as években
és kivételt „dobni” ahelyett, hogy folytatnánk
ismerték operációs rendszer szinten
z Kivétel dobás (throw) if (p == 0)
throw new NullPointerException();
 A Java kivételkezelése a C++-on alapul (esetleg – Kivétel objektum jön létre a heap-en
az Object Pascal-on), a C++ kivételkezelése – Az aktuális programvégrehajtás megáll és a kivétel objektum
pedig az Ada-n referenciája „kidobódik”
– A kivételkezelő mechanizmus veszi át az irányítást és keres
 Még egy jelentős előny: „Megtisztul” a kód,
egy megfelelő kivételkezelőt, ami lekezeli a hibát és folytatja
mert különválik az „igazi” kód a hibakezeléstől a program végrehajtását
Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák
2002. 04. 08. 162 2002. 04. 08. 163
© Ferenc Rudolf © Ferenc Rudolf

Kivételek argumentumai Kivétel elkapása


 Minden beépített kivételnek két konstruktora  Ha valahol el lett dobva egy kivétel, akkor az
van: a default és ami egy string-et vár (ezt feltételezi, hogy azt valahol máshol „elkapják”
később fel lehet használni)
if (p == 0)  Védett régió: A kód olyan része, ami kivételeket
hozhat létre és amit a hibakezelő kód követ
throw new NullPointerException(”p is not initialized!”);

A kivételkezelés valójában egy alternatív try {

„return” mechanizmus // „normál kód”, amiben kivétel keletkezhet


// (védett régió)
} catch(ExceptionType1 e1) {
– A kivétel objektum van „visszaadva” (a metódus // hibakezelő kód az e1 kivételre

visszatérési típusa más!) } catch(ExceptionType2 e2) {


// hibakezelő kód az e2 kivételre
throw e2; // tovább is lehet dobni
– Nem biztos, hogy csak egy szinttel tér vissza! } catch(Exception e) {
// hibakezelő kód az összes (megmaradt) kivételre
(Addig, amíg valaki nem kezeli le a kivételt) }

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 164 2002. 04. 08. 165
© Ferenc Rudolf © Ferenc Rudolf
Saját kivételek Kivétel specifikáció Exception
specification
 Saját kivételeket is lehet írni, származtatni kell  Java-ban meg kell adni, hogy egy
valamelyik class SimpleException extends Exception {
}
metódus milyen kivételeket dobhat a throws
létező kivétel public class SimpleExceptionDemo {
kulcsszóval (ez része a metódus-deklarációnak)
osztályból public void f() throws SimpleException {
System.out.println( void f() throws SimpleException, NullPointerException {
// ...
(pl. Exception
"Throwing SimpleException from f()");
throw new SimpleException(); }
}
(ős)osztályból) public static void main(String[] args) {
SimpleExceptionDemo sed =
new SimpleExceptionDemo();
try {
sed.f();
} catch(SimpleException e) {
System.err.println("Caught it!");
}
}
}

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 166 2002. 04. 08. 167
© Ferenc Rudolf © Ferenc Rudolf

Java standard kivételek RuntimeException


 Ősosztály: Throwable, két leszármazottja van:  Javastandard kivétel, amit nem kell külön
– Error: általában nem kell vele foglalkozni (fordítási megadni a kivétel specifikációban
időbeni- és rendszer hibákat képvisel)  Azon kivételek őse, amiket a virtuális gép
– Exception: a Java programozó számára ez az dobhat normális működés közben, pl.:
„ősosztály” – NullPointerException
A kivételek leírása megtalálható a Java – ClassCastException
honlapján: – IndexOutOfBoundsException
http://java.sun.com/j2se/1.3/docs/api/java/lang/Exception.html – stb.

Rendszerfejlesztés előadás fóliák Rendszerfejlesztés előadás fóliák


2002. 04. 08. 168 2002. 04. 08. 169
© Ferenc Rudolf © Ferenc Rudolf
Vége
(A Java programozási nyelv)

Rendszerfejlesztés előadás fóliák


2002. 04. 08. 170
© Ferenc Rudolf

You might also like