You are on page 1of 53

Objektumorientált szoftvertervezés

1. Java ismétlés, szálak, kollekciók, reflection

© BME IIT, Goldschmidt Balázs

Az objektumorientáltság helye
egyszerűség
KISS: keep it simple, stupid

nincs jó vagy rossz
használhatóság a kérdés

mindig a célnak megfelelő eszközt használjuk

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

2

Az objektumorientáltság helye 2
gépi kód
assembly komponensek objektumorientált strukturált

makrók
"strukturált" assembly

strukturált programozás
függvények, adatszerkezetek

objektumorientáltság
objektumok

komponensek (pl. beanek)
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 3

1

A Java története
strukturált mindent megenged egyszerű szintaxis alapja a C nyelv osztályok genericitás fv felüldefiniálás memória-gondok bonyolult szintaxis

C

Smalltalk

tisztán OO virtuális gép

C++

Objective C

alapja a C nyelv interfészek fogalma Smalltalk-szerű OO nem túl elterjedt

Java C#
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

korlátozott lehetőségek egyszerű szintaxis biztonság, szerializálás, hálózat virtuális gép

4

Objektumok, Osztályok és Interfészek

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

5

Osztályok
egységbezárás (attribútumok és metódusok)
public, protected, private, package láthatóság static: osztályszintű attribútum vagy metódus

csak egyszeres öröklés
csak virtuális függvények abstract: meg kell valósítani final: nem lehet felüldefiniálni

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

6

2

Öröklés
public class A { private void f1(){System.out.println("A.f1");} public void f2() {System.out.println("A.f2");} public void f3() { f1(); } public void f4() { f2(); } } public class B extends A { private void f1() {System.out.println("B.f1");} public void f2() {System.out.println("B.f2");} public static void main(String[] args) { A a1 = new A(); a1.f3(); // A.f1 a1.f4(); // A.f2 } }
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 7

Öröklés
public class A { private void f1(){System.out.println("A.f1");} public void f2() {System.out.println("A.f2");} public void f3() { f1(); } public void f4() { f2(); } } public class B extends A { private void f1() {System.out.println("B.f1");} public void f2() {System.out.println("B.f2");} public static void main(String[] args) { A a2 = new B(); a2.f3(); // A.f1 // B.f2 a2.f4(); } }
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 8

Öröklés
public class A { private void f1(){System.out.println("A.f1");} public void f2() {System.out.println("A.f2");} private void f5() { f2(); } public void f6() { f5(); } } public class B extends A { private void f1() {System.out.println("B.f1");} public void f2() {System.out.println("B.f2");} public static void main(String[] args) { A a3 = new A(); A a4 = new B(); a3.f6(); // A.f2 a4.f6(); // B.f2 } }
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 9

3

Öröklés (konstruktor, Java)
public class A { void foo() { System.out.println("A.foo");} public A() { foo(); } } public class B extends A { void foo() { System.out.println("B.foo");} public B() { super(); } public static void main(String[] args) { A a = new A(); // A.foo B b = new B(); // B.foo } }
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 10

Öröklés (konstruktor, C++)
class A { public: virtual void foo() { cout << “A.foo” << endl; } A() { foo(); } }; class B : public A { public: virtual void foo() { cout << “B.foo” << endl; } B() : A() { } }; int main() { A a(); B b(); }

// A.foo // A.foo
11

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

Objektumok egyedisége
== operátor boolean equals(Object o)
tartalom alapú összehasonlítás rekurzió

a == b

a.equals(b)

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

12

4

Másolás
Cloneable interfész megvalósításával Object.clone()felüldefiniálásával
super.clone()-t illik meghívni

Shallow copy
csak a referenciákat másoljuk
pl. Vector másolata ugyanazokra az objektumokra hivatkozik

Deep copy
rekurzív másolás
pl. C++ string példa

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

13

Másolás
Deep copy A3 Original A1 Shallow copy A2

B3

B1

C3

D3

C1

D1

Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs

14

Másolás öröklés nélkül
public class A { B b; ... public Object clone() { // shallow A a2 = new A(); a2.b = b; return a2; } public Object clone() { // deep A a3 = new A(); a3.b = b.clone(); return a3; } ... }
Objektumorientált SW-tervezés © BME IIT, Goldschmidt Balázs 15

5

clone(). } Objektumorientált SW-tervezés © BME IIT. a3.b = a. public Object clone() { // shallow A a2 = (A)super.. return a3. } public Object clone() { // deep A a3 = (A)super. Goldschmidt Balázs 18 6 .clone().clone()..b = b. Goldschmidt Balázs 16 Copy constructor public class A { B b. mert new absztrakt típusoknál gond Objektumorientált SW-tervezés © BME IIT.b.b). // NE!!! } public A(A a) { this. } Objektumorientált SW-tervezés © BME IIT. return a2.Másolás öröklés esetén public class A extends E { B b. public A(A a) { this = a. Goldschmidt Balázs 17 Deep clone vs.. // ctr vs clone } public A(A a) { this. //??? a2.b = b. // öröklés? } .b = new B(a.clone(). } ..clone(). Copy ctr Előny Deep clone absztrakt típusokra is jó Hátrány nem new -t használ Copy ctr egységes.

Goldschmidt Balázs 7 . astore_1 (5. Goldschmidt Balázs 20 Boxing megvalósítása a += 2. // itt b-ből int lesz: a=8 Objektumorientált SW-tervezés © BME IIT. int a = 5. boxing i1 > 120.0 óta Primitív típusok és csomagolóik automatikus konverziója Vector v = new Vector().equals(i2) // igaz. // boxing i1. // boxing } Objektumorientált SW-tervezés © BME IIT.Boxing Java 5.valueOf:(I)Ljava/lang/Integer. Goldschmidt Balázs 19 Boxing 2 Csak akkor használjuk. // boxing Integer i2 = Integer. // igaz. 5: 6: 9: 10: 11: 14: aload_1 invokevirtual #3.intValue:()I iconst_2 iadd invokestatic #2. // csak ha -128<i1≤127 i1 <= i2. // itt valójában egy // Integer kerül a vektorba Integer b = 3.6) (9.intValue(). boxing i1++. a = Integer. v. // létrejön egy új Integer a = a + b.valueOf(tmp).parseInt(args[0]). //Integer. //java/lang/Integer. ha muszáj Nem hatékony public static void main(String args[]) { Integer i1 = Integer. Objektumorientált SW-tervezés © BME IIT. // növel. nincs boxing i1 == i2.add(a).parseInt(args[0]). tmp += 2.14) 21 int tmp = a.10) (11.

put(s. if (s==null) break.Integer>().get(s)+=1. false boolean B2 = (i. if (hm. Goldschmidt Balázs 24 8 . Goldschmidt Balázs 23 Boxing hibák hm. i += 1. else hm.equals(j)).put(s.int> hm = new HashMap<String. boolean B1 = (i == j). } Objektumorientált SW-tervezés © BME IIT.containsKey(s)) hm. } Objektumorientált SW-tervezés © BME IIT. if (hm.1).get(s).Integer> hm = new HashMap<String.Boxing kollekciókban HashMap<String.containsKey(s)) hm.int>(). HashMap<String.get(s).get(s)+=1. Goldschmidt Balázs 22 Boxing kollekciókban folyt.1). Integer i = hm. j = hm. false Objektumorientált SW-tervezés © BME IIT. else hm. while(true) { String s = readLine(). if (s==null) break.get(s)+=1. while(true) { String s = readLine().

Interfészek Csak a metódusok deklarációja nincs semmifajta implementáció Fontos az újrahasználáshoz Attribútumai lehetnek automatikusan public static final (globális konstans) public static final int maxLength = 100. mint az absztrakt osztály! Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 27 9 . Goldschmidt Balázs 26 API implementáció Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 25 Belső osztályok Osztályon belül van definiálva akár metóduson belül is Szintek száma nincs megszabva Eléri a külső osztály(ok) attribútumait és metódusait Céljuk: egységbezárás kis segédosztályok a főosztály közelében Formális paraméterek. lokális változók vagy kivételkezelő paraméterek: kötelezően final Objektumorientált SW-tervezés © BME IIT. Többszörös öröklés (interfészek között) csak egyértelmű attribútumokkal Többszörös megvalósítás Nem ugyanaz.

. Goldschmidt Balázs 28 String hash 1... i++) { h = 31*h + val[off++]. for (int i = 0. int skip = Math. Goldschmidt Balázs 29 String hash 1.5 public class String { // java 1.toHexString(hashCode()). } return h. Goldschmidt Balázs 30 10 . } public String toString() { return getClass().. public int hashCode() { int h = hash. } .5 private int hash = 0. i < len.1 public class String { // java 1. char val[] = value.1 private int hash = 0. int len = count. int len = count.max(1.len/8). } hash = h. } } Objektumorientált SW-tervezés © BME IIT. public int hashCode() { int h = hash. for (int i = 0. } return h.getName() + "@" + Integer. i < len.Object equals és toString public class Object { . if (h == 0) { char val[] = value. } Objektumorientált SW-tervezés © BME IIT. } } Objektumorientált SW-tervezés © BME IIT. public boolean equals(Object obj) { return (this == obj). } hash = h. i += skip) { h = 37*h + val[i]. if (h == 0) { int off = offset.

Object public o1. o2. return h.cache[i + offset]. h = 31*h+o1.hashCode(). } } Objektumorientált SW-tervezés © BME IIT. .hashCode().128). on. int hashCode() { int h = 0.. if (i >= -128 && i <= 127) { return IntegerCache. Goldschmidt Balázs 32 Memóriakezelés Objektumorientált SW-tervezés © BME IIT.length.. } return new Integer(i). i < cache. Goldschmidt Balázs 33 11 . h = 31*h+on.hashCode().. static {for(int i = 0. public int hashCode() {return value. } } public static Integer valueOf(int i) { final int offset = 128. } } Objektumorientált SW-tervezés © BME IIT..} private static class IntegerCache { private IntegerCache(){} static final Integer cache[] = new Integer[-(-128) + 127 + 1]. i++) cache[i] = new Integer(i .Integer public class Integer { private final int value. h = 31*h+o2. Goldschmidt Balázs 31 Általános hash függvény class Test { Object Object .

rejtett kettős indirekció másolás.Memóriakezelés C már szenvedett a memóriahibáktól pointerek + aritmetika a[3] void* malloc/calloc/realloc/free copy konstruktor virtuális destruktor értékadás new/delete ≡ *(a+3) ≡ *(3+a) ≡ 3[a] C++ próbált javítani. virtual B { int l.0/gc_tuning_5. Goldschmidt Balázs 36 12 . de inkább rontott class C : A. l(i) { l++. amire már senki sem hivatkozik void finalize() meghívódik Explicit indítás: System. Complex c.sun. dupla tár Optimalizálás is kellhet http://java.html Objektumorientált SW-tervezés © BME IIT. 34 Objektumorientált SW-tervezés © BME IIT. public: C(Complex k.com/docs/hotspot/gc5. Goldschmidt Balázs Memóriakezelés Java-ban beépített Garbage Collector (GC) new van: heap-en foglal helyet delete nincs: GC szabadít fel Azt törli.gc() Objektumorientált SW-tervezés © BME IIT. } }. int i) : A(i).gc() vagy Runtime. c(k). Goldschmidt Balázs 35 Garbage collector Gyűrűket is felismeri O1 O3 O4 O2 O5 Defragmentálást is végezhet csúsztatás.

Goldschmidt Balázs 37 Szálkezelés Beépített tulajdonság java.Thread. Goldschmidt Balázs 39 13 .lang.lang.Thread Object +wait() +notify() +notifyAll() <<interface>> Runnable +run() Thread +id +name +priority +daemon +start() +run() +sleep() +yield() +join() Objektumorientált SW-tervezés © BME IIT.lang.Szálkezelés Objektumorientált SW-tervezés © BME IIT. java.Runnable Prioritásos ütemezés nem szigorú Csoportok (ThreadGroup) szálak egységes kezeléséhez Konkurens memóriahasználat kölcsönös kizárás monitorral Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 38 java.

Thread stop stop implementálása private volatile boolean running. Goldschmidt Balázs 40 java.int nanos]]) az adott szál befejeződésére (adott ideig) vár setDaemon(boolean on) daemon szálként lesz indítva a JVM leáll. stb esetén InterruptedException Objektumorientált SW-tervezés © BME IIT.Thread join([long millis [. } public void run() { while (running) { try { thisThread. ha már csak daemon szálak futnak hívás az indítás előtt boolean isDaemon() daemon-e Objektumorientált SW-tervezés © BME IIT. } public void stop() { running = false. wait. Goldschmidt Balázs 41 java.Thread run() a szál futtatható kódja start() a szál indítása yield() a többi szálnak adja át a futási jogot sleep(long millis [. } } Objektumorientált SW-tervezés © BME IIT.lang. int nanos]) alvó állapotba viszi a szálat interrupt() megszakítja a szál várakozását pl.sleep(interval).java. } catch (InterruptedException e){} repaint().lang.lang. sleep. MyThread(){ running = true. Goldschmidt Balázs 42 14 .

Thread boolean isAlive() fut-e még static Thread currentThread() az aktuális szál referenciája static int activeCount() a szál csoportjában aktív szálak száma ThreadGroup getThreadGroup() a szál csoportját adja vissza Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 45 15 .lang. Goldschmidt Balázs 43 java.Thread int getId() a szál azonosítója set/getName() szál neve set/getPriority() szál prioritása Objektumorientált SW-tervezés © BME IIT.lang. Goldschmidt Balázs 44 Szál készítése: öröklés A Thread osztályból származtatunk Object +wait() +notify() +notifyAll() <<interface>> Runnable +run() Thread +id +name +priority +daemon +start() +run() +sleep() +yield() +join() MyThread +run() Objektumorientált SW-tervezés © BME IIT.java.

a++) { System.Szál készítése: öröklés A Thread osztályból származtatunk public class MyThread extends Thread { int a.out.run(). } public void run() { for (a = 0. t. Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 47 Szál készítése: delegáció A Runnable interfészt valósítjuk meg public class MyThread implements Runnable { int a. } } } MyThread mt = new MyThread(1000). mt. a++) { System. int b. // kell egy szál. public MyThread(int i) { b=i. Thread t = new Thread(mt).start(). Objektumorientált SW-tervezés © BME IIT. mt.println(a).out. ami futtat t.join(). Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 48 16 . int b.start(). } public void run() { for (a = 0. a < b. public MyThread(int i) { b=i. a < b.println(a). } } } MyThread mt = new MyThread(1000).join(). Goldschmidt Balázs 46 Szál készítése: delegáció A Runnable interfészt valósítjuk meg Object +wait() +notify() +notifyAll() <<interface>> Runnable +run() -d Thread +id +name +priority +daemon +start() +run() +sleep() +yield() +join() MyThread +run() d.

.1 +inside Thread -blocked * Thread Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 49 Kölcsönös kizárás minden objektumhoz egy monitor JVM-ben lock és unlock utasítás lock/unlock mindig párban egyszerre egy szál lehet a monitorban többi szál várakozási sorban rekurzív belépés engedélyezett static boolean holdsLock(Object o) igaz.1 * 0. Goldschmidt Balázs 51 17 .Tervezési kérdés (A→B) Öröklés B hozzáfér A nem privát tagjaihoz közös az állapotuk B statikusan cserélhető Delegáció B nem fér könnyen A-hoz sokszor nem is ismeri B dinamikusan cserélhető Objektumorientált SW-tervezés © BME IIT.. ha az aktuális szálnál van a monitor Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 50 Kölcsönös kizárás: monitor Object Monitor +wait() +notify() +notifyAll() 0.

i). } } Objektumorientált SW-tervezés © BME IIT.. } Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs synchronized void foo() { . akin a metódust hívjuk egyenértékű a teljes metódust felölelő blokkal void foo() { synchronized(this) { .. } 53 Volatile Minden szál egy memória-másolaton dolgozik caching A másolatokat szinkronizálni kell synchronized blokkban megtörténik volatile kulcsszó a változó minden módosítása és elérése szinkron Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 52 Kölcsönös kizárás synchronized lehet blokk előtt ekkor objektum referencia kell metódus előtt ekkor a monitor azé az objektumé.. public void increment(String s) { .. Integer> ht = . ht. synchronized (ht) { int i = ht. } ... i++...Kölcsönös kizárás: synchronized megvalósítás a synchronized kulcsszóval Hashtable<String... Goldschmidt Balázs 54 18 .get(s).put(s..

} public static Singleton getInstance() { if (obj == null) { obj = new Singleton(). store.Konkurens double. } } Objektumorientált SW-tervezés © BME IIT.. write műveletei 32 bites word-on dolgozhatnak emiatt egy egyszerű double értékkezeléséhez két művelet kellhet több szál esetén hazárdos érték fordulhat elő ha a változó volatile. long kezelés double. Goldschmidt Balázs 55 Feladat Készítsünk szálbiztos Singleton-t legfeljebb egy példány több szálból is elérhető a létrehozás minél kevesebb kölcsönös kizárással sokáig tart az inicializáció Objektumorientált SW-tervezés © BME IIT. long: 64 bites értékek a JVM load. Goldschmidt Balázs 57 19 . akkor a fenti műveletek garantáltan atomiak több szál esetén is mindig korrekt értékek Objektumorientált SW-tervezés © BME IIT. private Singleton() { .. } return obj. read. Goldschmidt Balázs 56 Singleton és szálak: naívan public class Singleton { private static Singleton obj.

} public static Singleton getInstance() { if (obj == null) { synchronized (Singleton. } public static synchronized Singleton getInstance() { if (obj == null) { obj = new Singleton(). private Singleton() { . } } } return obj. } public static Singleton getInstance() { if (obj == null) { synchronized (Singleton. } } Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 60 20 ... } } return obj... private Singleton() { .Singleton és szálak: synch'd public class Singleton { private static Singleton obj. } return obj... } } Objektumorientált SW-tervezés © BME IIT.class) { obj = new Singleton(). private Singleton() { .class) { if (obj == null) { obj = new Singleton(). Goldschmidt Balázs 59 Singleton és szálak: synch'd 3 public class Singleton { private static Singleton obj. } } Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 58 Singleton és szálak: synch'd 2 public class Singleton { private static Singleton obj.

} } Objektumorientált SW-tervezés © BME IIT. } Objektumorientált SW-tervezés © BME IIT. existing = true.. amíg nem értesítik vagy timeout a szálnak az objektum monitorában kell lennie a várakozás alatt a monitorból kilép synchronized (obj) { . } } Objektumorientált SW-tervezés © BME IIT.Singleton és szálak: synch'd 4 public class Singleton { private static Singleton obj.. // monitor szabad } catch (InterruptedException ie) {.} . public static Singleton getInstance() { if (!existing) { synchronized (Singleton.... private Singleton() { . Goldschmidt Balázs 63 21 .wait([long millis [.class) { if (obj == null) { Singleton tmp = new Singleton()...int nanos]]) a hívó szál vár. } private static boolean existing = false. obj = tmp. } } } return obj.. Goldschmidt Balázs 62 Szálak szinkronizálása Object.. } public static Singleton getInstance() { if (obj == null) { synchronized (Singleton. } } } return obj. private Singleton() { .wait(). try { obj. Goldschmidt Balázs 61 Singleton és szálak: flaggel public class Singleton { private static Singleton obj..class) { if (!existing) { obj = new Singleton().

1.3: wait) 1.notifyAll() felébreszti az objektumon váró összes szálat a kölcsönös kizárás érvényesül a szálnak az objektum monitorában kell lennie Objektumorientált SW-tervezés © BME IIT.3 : wait() 1.1: enter) 2. Goldschmidt Balázs 64 Monitor és wait-notify Wait/notify csak szinkronizáltan a szálnak a monitorban kell lennie különben IllegalMonitorStateException Wait alatt kilép a monitorból más szál hozzáfér az objektumhoz wait után csak ha visszalépett Objektumorientált SW-tervezés © BME IIT.1.2.1 : enter() 2.notify() felébreszt egyet az objektumon váró szálak közül a szálnak az objektum monitorában kell lennie a felébresztett szál csak akkor folytatja futását.1 : run() Objektumorientált SW-tervezés © BME IIT.Szálak szinkronizálása 2 Object.2 : foo() 1.3.1.1.1 : run() 1.1. Goldschmidt Balázs 66 22 .1.1. ha a hívó szál kilépett a monitorból Object.1: enter() 2.3 : exit() (1.2 : notify() 2.1.1.4 : exit() Obj T2 2 : start 2. Goldschmidt Balázs 65 Monitor és wait-notify T1 1 : start 1.1.1 : exit() (2.1.1 : enter() 1.

sleep) TERMINATED befejezte a működését Objektumorientált SW-tervezés © BME IIT.wait running sleep WAITING TIMED_WAITING o. Thread. TIMED_WAITING várakozó szál (Object. Goldschmidt Balázs 69 23 . Integer v){ s := v. then s := s-1. /* must be atomic once s > 0 is detected */ } V(Semaphore s) { s := s+1. } P(Semaphore s) { // Acquire Resource wait until s > 0. Goldschmidt Balázs 67 Szálak állapotai exit_mon_queue NEW start RUNNABLE schedule schedule yield BLOCKED enter _mon_queue [wait timeout] o. } // Release Resource /* must be atomic */ Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs [sleep timeout] 68 Példa: Szemafor pszeudokód Init(Semaphore s.notify[All] queued [end_of_run] TERMINATED Objektumorientált SW-tervezés © BME IIT.wait.Szálak állapotai NEW újonnan létrehozva RUNNABLE (+running) futásra kész BLOCKED monitorra vár WAITING.

} public synchronized void waiting() { in++. } } } Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 70 Példa: sorompó feladat public class Barrier {// N szál megvárja egymást .} s--. } } Objektumorientált SW-tervezés © BME IIT. } synchronized public void P() throws InterruptedException { while (s <= 0) {wait(). Goldschmidt Balázs 72 24 . notifyAll(). public Semaphore (int v) { s=v.} public synchronized void waiting() { ... if (in < n) { wait(). Goldschmidt Balázs 71 Példa: sorompó megoldás public class Barrier { private int n. in.. if (in < n) { wait(). public Barrier(int i) {n = i. } synchronized public void V() { s++.. } else { in = 0.. } else { in = 0. } } } Objektumorientált SW-tervezés © BME IIT. in = 0.. notify(). notifyAll().Példa: Szemafor Javaban public class Semaphore { private int s. public Barrier(int i) {.

foo(). Mindkettő ugyanazt a Qux objektumot ismeri (q).bar() metódusát. } synchronized void bar() { notifyAll(). Goldschmidt Balázs 75 25 . A t1 meghívja a q. } } //1 //2 //3 //4 //5 //6 //7 Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 73 Vizsgapélda (folyt.) public class Qux { synchronized void foo() throws InteruptedException { Thread.sleep(10000).Vizsgapélda Egy programban két Java szálunk van. t1 és t2. Goldschmidt Balázs 74 Genericitás Objektumorientált SW-tervezés © BME IIT. és az egyes sorok futásakor milyen állapotba kerülnek a szálak? Objektumorientált SW-tervezés © BME IIT. Milyen sorrendben zajlnak le a számozott sorok. // 10 mp-ig alszik wait(). A metódusok lefutása után a szálak megállnak. majd 1 mp múlva t2 a q.

T b) { return (a>b)?a:b. hogy kiderül #define max(a. doksi fontos fordításkor kiderül a hiba Objektumorientált SW-tervezés © BME IIT. } szemantikai megkötések T típusra. Goldschmidt Balázs 78 26 .b) ((a)>(b)?(a):(b)) mellékhatások megnehezítik a használatát Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 76 Genericitás 2 Cél: ugyanaz a kód többféle típusra is egyformán működjön C++ megoldása template <class T> T max(T a. Goldschmidt Balázs 77 Genericitás 3 Cél: ugyanaz a kód többféle típusra is egyformán működjön Java eredeti megoldása (pre 5.Genericitás Cél: ugyanaz a kód többféle típusra is egyformán működjön C megoldásai void* malloc(size_t s) kasztolgatás elég veszélyes a hiba nem biztos.0) minden objektum az Object leszármazottja C-s void* filozófia új köntösben kód tele van kasztolásokkal hiba csak futási időben derül ki Objektumorientált SW-tervezés © BME IIT.

Goldschmidt Balázs 80 Generikus példa: Template public class Store<T>{ T[] os. s. i < s.print(l).out. size++. System. int size.get(i). s.out. } public int size() { return size.put("world").0 óta vannak C++ template-hez hasonlók De: nincs minden paraméterhez új osztály → kisebb kód egyértelműen jelzik az elvárt interfészt programozó tudja. public Store(int i) { v = (T[])(new Object[i]). size = 0. } Objektumorientált SW-tervezés © BME IIT.print(l). } public void put(T o) { os[size]=o.size(). } public Object get(int i) { return os[i].put("!"). size++. } Objektumorientált SW-tervezés © BME IIT. } public T get(int i) { return os[i].get(i). } } Store<String> s = new Store(10). for (int i = 0. Goldschmidt Balázs 79 Generikus osztályok Java 5. size = 0. System. i++) { String l = (String)s. } } Store s = new Store(10).Generikus példa: Object public class Store{ Object[] os. s. s.size(). } public int size() { return size.put("world").put("hello ").put("!"). public Store(int i) { v = new Object[i]. Goldschmidt Balázs 81 27 . i < s. s. } public void put(Object o) { os[size]=o. i++) { String l = s. s. for (int i = 0. int size. mit várunk el fordítási időben hibajelzés kasztolás-mentes kód Objektumorientált SW-tervezés © BME IIT.put("hello ").

} } Objektumorientált SW-tervezés © BME IIT. 13: aload_1 14: aload_2 15: invokevirtual #5. Integer a = 3. 24: checkcast #7. Goldschmidt Balázs 82 Genericitás megvalósítása Vector<Integer> v = new Vector<Integer>(). //class java/lang/Integer 27: astore_3 // return 28: return Objektumorientált SW-tervezés © BME IIT.add(a). 19: aload_1 20: iconst_0 21: invokevirtual #6. Goldschmidt Balázs 83 Genericitás megvalósítása v. 8: iconst_3 9: invokestatic #4.valueOf:(I)Ljava/lang/Integer. //java/util/Vector. 12: astore_2 Objektumorientált SW-tervezés © BME IIT.get(0)."<init>":()V 7: astore_1 Integer a = 3. b = v. Integer b. //class java/util/Vector 3: dup // konstruktor paramétere 4: invokespecial #3. //java/util/Vector.add(a).get(0).add:(Ljava/lang/Object. Goldschmidt Balázs 84 28 . //Integer. //java/util/Vector.)Z 18: pop // visszatérési értéket eldobjuk b= v. 0: new #2. v.get:(I)Ljava/lang/Object.Genericitás megvalósítása public class Proba { static public void main(String[] args) { Vector<Integer> v = new Vector<Integer>().

isEmpty()) { System. Goldschmidt Balázs 85 Gondok az örökléssel (tömb) Object[] oa = new String[10]. Goldschmidt Balázs 86 Gondok az örökléssel (kollekció) void printFifo(Fifo<Object> of) { while (!of. } String a. Goldschmidt Balázs 87 29 .pop()).out. Honnan tudja a fordító. Fifo<Object> of = sf.get2(0). } } Fifo<String> sf = new Fifo<String>(). Fifo<Object>-nek a Fifo<String> nem leszármazottja! Inkompatibilis a típusuk Objektumorientált SW-tervezés © BME IIT.get1(0). String[]-bel De csak a dinamikus típusnak megfelelő objektumokat tárolhat Objektumorientált SW-tervezés © BME IIT. of.push(new Integer(13)). oa[0] = ”Hello”. b = store. mikor kell cast? template-típus tárolva van (T) Objektumorientált SW-tervezés © BME IIT. } public T get2(int i) { return os[i]. a = store.b. //ArrayStoreException Object[] helyettesíthető pl.Metainformációk Tekintsük a következő kódot public Object get1(int i) { return os[i].println(of. oa[1] = new Integer(2).

f2.push(last). // hibás hívás Objektumorientált SW-tervezés © BME IIT. Fifo<E> f2){ E last = null.isEmpty()){ last = f1. } } Fifo<String> sf = new Fifo<String>().push(new Integer(13)). ahol F az E leszármazottja? void pushAll(Fifo<? extends E> s) { while (!s.. } Fifo<String> fs = ..isEmpty()) { push(s. Goldschmidt Balázs 89 Kötött dzsóker: super public E popTo(Fifo<E> f1.println(of. // ford..isEmpty()) { System. hiba of. Goldschmidt Balázs 88 Kötött dzsóker: extends void pushAll(Fifo<E> s) { while (!s. Goldschmidt Balázs 90 30 .. Fifo<Object> fo = . String last = popTo(fs.Dzsóker (wildcard): ? void printFifo(Fifo<?> of) { while (!of. Fifo<?> of = sf.pop(). } return last.out. while (!f1.fo).push(”Hello”). // ford..isEmpty()) { push(s. of. hiba <?> konvertálható bármivé.pop()). ha s típusa Fifo<F>.pop()). így <Object>-té is visszafele nem megy Objektumorientált SW-tervezés © BME IIT.pop()).. } } Objektumorientált SW-tervezés © BME IIT. } } Mi legyen.

f2..isEmpty()){ last = f1.push(last)... } return last. Fifo<Object> fo = . // hibás visszatérés Objektumorientált SW-tervezés © BME IIT.isEmpty()){ last = f1. } Objektumorientált SW-tervezés © BME IIT. } return last.fo).. while (!f1. Fifo<E> f2){ E last = null..pop()..fo). while (!f1.push(last).. Fifo<Object> fo = . String last = popTo(fs.Kötött dzsóker: super 2 public E popTo(Fifo<? extends E> f1.isEmpty()){ last = f1.push(last). Goldschmidt Balázs 91 Kötött dzsóker: super 3 public E popTo(Fifo<E> f1. Fifo<? super E> f2){ E last = null. Fifo<? super E> f2){ E last = null. f2.pop(). } Fifo<String> fs = . while (!f1.pop(). } Fifo<String> fs = ..... f2. // hibátlan működés Objektumorientált SW-tervezés © BME IIT.. Goldschmidt Balázs 93 31 . String last = popTo(fs. } return last. Goldschmidt Balázs 92 Generikus metódusok static public <E> E popTo(Fifo<E> f1.

Goldschmidt Balázs 96 32 .Többszörös típusok Mi van akkor. Goldschmidt Balázs 94 Kollekciók Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 95 Kollekciók X Y * +listAll() +foo() Objektumorientált SW-tervezés © BME IIT. hogy X és Y interfészű legyen? <T extends X & Y> public static <T extends E & Comparable<? super F>> T max(Collection<? extends T> coll) Objektumorientált SW-tervezés © BME IIT. ha a generikus típus egyszerre kell.

Láncolt lista egy. Goldschmidt Balázs 97 Kollekciók: dinam.Kollekciók: tömb beépített típus mérete rögzített C/C++ nem ellenőriz. nincs realloc objektumok (referenciák) másolása elkerülhetetlen típuskompatibilitás öröklésnél kérdéses kényelmes leírni Objektumorientált SW-tervezés © BME IIT. keresésre Objektumorientált SW-tervezés © BME IIT.vagy kétirányú. keresés. Goldschmidt Balázs 99 33 . fésűs lista Bináris (n-es fa) fa egyensúly. törlés Alapfunkciók azonosak iterálás Implementáció-függő egyedi funckiók sorrendiség halmaz/lista deep/shallow copy optimalizálás: pl. adatszerk. AVL fa Szófa Hash-tábla hash függvény jósága Objektumorientált SW-tervezés © BME IIT. strázsa. Goldschmidt Balázs 98 Kollekciók: általánosítás Alapműveletek azonosak beszúrás. gyűrű. beszúrásra v. van realloc Java ellenőriz.

Goldschmidt Balázs 101 Collection interfész 2 void add(E e) optional void addAll(Collection<? extends E> c) optional hozzáadás. hogy rendezett vagy nem egyszeres vagy többszörös tárolás Definiciója generikus: Collection<E> Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 102 34 . nincs destruktorhívás! boolean retainAll(Col<? ext E> c) optional csak c-ben is szereplő objektumokat tartja meg Objektumorientált SW-tervezés © BME IIT.Kollekció keretrendszer Az interfészek Collection Map Set List Queue SortedMap SortedSet Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 100 Collection interfész Általánosított tároló interfész Lehet. shallow copy boolean remove(E e) optional boolean removeAll(Col<? ext E> c) optional csak a referenciák törlődnek.

Collection interfész 3 boolean contains(E e) optional boolean containsAll(Col<? ext E> c) optional tartalmazás void clear() összes objektum referenciájának törlése int size() boolean isEmpty() méret. üresség Objektumorientált SW-tervezés © BME IIT. ta típusú tömbbel tér vissza Iterator<E> iterator() egy Iterator interfészű objektumot ad vissza Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 103 Collection interfész 4 boolean equals(E e) azonosság: List és Set nem lehet azonos kötelezően szimmetrikus kell legyen Object[] toArray() a kollekció elemeit tartalmazó tömbbel tér vissza <T> T[] toArray(T[] ta) a kollekció elemeit tartalmazó. Goldschmidt Balázs 104 Iterator interfész Iterál egy kollekció elemein nem ismert a sorrend Definíciója: Iterator<E> boolean hasNext() igaz. Goldschmidt Balázs 105 35 . ha van még iterálandó elem E next() a következő elemmel tér vissza void remove() törli az utoljára visszaadott elemet a kollekcióból Objektumorientált SW-tervezés © BME IIT.

.hasNext()) { int a = i. // outboxing if (a < 0) { i. Goldschmidt Balázs 108 36 . Iterator i2 = c. i2.. Iterator<Integer> i = c.. i1..next(). .next().. // itt kapjuk a kivételt Objektumorientált SW-tervezés © BME IIT... az megzavarhatja a többi iterátort ilyenkor ConcurrentModificationException lehet a büntetés Collection c = . vagyis minden elem csak egyszer szerepel A sorrendjükről semmit sem tudunk Az iterátor is tetszőlegesen adhatja vissza az elemeket Nincs a kollekciót bővítő metódusa Tipikus implementáció: HashSet Objektumorientált SW-tervezés © BME IIT.. i1..remove(). i2. Iterator i1 = c. Goldschmidt Balázs 107 Set interfész Halmaz.next(). } } Objektumorientált SW-tervezés © BME IIT.Iterator interfész 2 Konkurencia (többszálúság) esetén ha elemet törlünk. Goldschmidt Balázs 106 Iterator interfész 3 Tipikus használata: Collection<Integer> c = .remove()..iterator().iterator().next(). while (i.iterator()..

hogy mi a sorrend természetes vagy Comparator minta (Strategy) Az iterátor az adott sorrendben adja vissza az elemeket Tipikus implementáció: TreeSet Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 110 Összehasonlítás Comparatorral Strategy minta: kivesszük T kezéből interface Comparator<T> int compare(T o1. T o2) T-ket hasonlít o1 ∆ o2 ↔ cmp(o1.cmp(o) ∆ 0 csak egyféleképpen működik fordítási időben eldől trükközni lehet ☺ Objektumorientált SW-tervezés © BME IIT.SortedSet interfész Olyan halmaz.o2) ∆ 0 boolean equals(Object obj) comparatorokat hasonlít Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 109 Összehasonlítás Természetes megvalósítja a Comparable<T> interfészt int compareTo(T o) this ∆ o ↔ this. amiben az elemek sorrendje rögzített Az elemek döntik el. Goldschmidt Balázs 111 37 .

helyére teszi e-t. a többit shifteli E set(int i. E e) a lista i. helyétől berakja e elemeit. elem referenciáját Objektumorientált SW-tervezés © BME IIT. helyére teszi e-t. vagy null-t ha természetes rendezés E first() első elem E last() utolsó elem SortedSet<E> headSet(E to) to-ig az elemek (exkluzívan) SortedSet<E> tailSet(E from) from-tól az elemek (inkluzívan) SortedSet<E> subSet(E from.SortedSet interfész 2 Comparator<? super E> comparator() visszaadja a rendező objektumot. Goldschmidt Balázs 113 List interfész 2 boolean add(E e) a lista végére fűzi e-t void add(int i. Col<? ext E> e) a lista i. Goldschmidt Balázs 112 List interfész Elemek sorozata (szekvencia) Egy elem többször is Minden elem helye ismert index alapján elérhetők Kereshetőek az elemek ListIterator-t ad a hatékonyabb eléréshez ListIterator az Iterator leszármazottja Tipikus implementáció: ArrayList Objektumorientált SW-tervezés © BME IIT. a korábbi elemet visszaadja E get(int i) visszaadja az i. Goldschmidt Balázs 114 38 . E to) from-tól to-ig az elemek Objektumorientált SW-tervezés © BME IIT. a többit shifteli boolean addAll(int i. E e) a lista i.

ha previous tud még elemet adni int nextIndex() | int previousIndex() a következő next/previous hívással visszaadandó elem indexe Objektumorientált SW-tervezés © BME IIT.List interfész 3 int indexOf(Object o) visszaadja az objektum első előfordulásának helyét int lastIndexOf(Object o) visszaadja az objektum utolsó előfordulásának helyét E remove(int i) a lista i. hiba esetén kivételt dob visszatérési értékben jelez Tipikus implementáció: LinkedList Objektumorientált SW-tervezés © BME IIT. Comparator-vezérelt Kétfajta metódus. Goldschmidt Balázs 117 39 . Goldschmidt Balázs 116 Queue interfész Puffer implementálásához Lehet FIFO. a referenciájét visszaadja List<E> subList(int from. int to) visszaadja egy listában az intervallum elemeit ListIterator<E> listIterator([int i]) [adott indextől] lista-iterátort ad vissza Objektumorientált SW-tervezés © BME IIT. helyéről törli az elemet. Goldschmidt Balázs 115 ListIterator interfész void add (E e) hozzáadja az objektumot a listához az aktuális pozíción void set(E e) utoljára visszaadott elemet cseréli E previous() a legutoljára visszaadott elem előtti elemet adja vissza boolean hasPrevious() igaz. LIFO.

Goldschmidt Balázs 119 Map interfész 2 Definíció: Map<K. de nem törli a sor elején levő elemet E remove() (NoSuchElementException) E poll() visszaadja és törli a sor elején levő elemet Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 120 40 .Queue interfész 2 boolean add(E e) (IllegalStateException) boolean offer(E e) berakja az objektumot a sorba E element() (NoSuchElementException) E peek() visszadja. Goldschmidt Balázs 118 Map interfész Kulcsok és értékek párjait tárolja Kulcs alapján értéket egyértelműen visszaadja Módosítható (mutable) objektumok használata kontraindikált Három nézet kulcsok halmaza értékek halmaza kulcs-érték párok halmaza Tipikus implementáció: HashMap Objektumorientált SW-tervezés © BME IIT.V> K a kulcsok típusa V az értékek típusa Ami ugyanaz. mint a Collection-nél: void clear() boolean equals() boolean isEmpty() int size() Objektumorientált SW-tervezés © BME IIT.

entrySet()) ezt tükrözik az iterátorok a kulcsok sorrendjében lépnek Tipikus implementáció: TreeMap Objektumorientált SW-tervezés © BME IIT. values(). hogy a kulcsok rendezve legyenek vagy természetes rendezés vagy Comparator alapján A visszaadott nézetek (keys().Map interfész 3 V put(K key. Goldschmidt Balázs 123 41 . ? ext V> m) a megadott leképzés elemeit hozzáadja a leképzéshez V get(K key) visszaadja a kulcshoz tartozó értéket.Entry<K. ha leképzés tartalmazza a kulcsot/értéket Set<K> keySet() visszaadja a leképzésben szereplő kulcsokat Miért Set és Collection? Collection<V> values() visszaadja a leképzésben szereplő értékeket Set<Map. Goldschmidt Balázs 121 Map interfész 4 boolean containsKey(Object key) boolean containsValue(Object value) igaz.V>> entrySet() visszaadja a párok halmazát Objektumorientált SW-tervezés © BME IIT. nem törli V remove(K key) törli és visszaadja a kulcshoz tartozó értéket Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 122 SortedMap interfész A Set kibővítése úgy. V value) hozzáadja a kulcs-érték párt a leképzéshez void putAll(Map<? ext K.

out. } Objektumorientált SW-tervezés © BME IIT. K to) SortedMap<K. } } Hátránya nincs remove() 126 Objektumorientált SW-tervezés © BME IIT..println(s)..V> subMap(K from..println(i).5 bevezette az egyszerűsített for ciklust Mindenen. Goldschmidt Balázs 125 For ciklus kollekción 2 Előnyei olvashatóbb..5 előtt iterátorral hasNext() és next() metódusokkal Java 1. for (Integer i : c) { System. ..V> headMap(K from) SortedMap<K. Goldschmidt Balázs 124 For ciklus kollekción Java 1.out. tisztább kód tömbön is működik static public void main(String[] args) { for (String s : args) { System.SortedMap interfész 2 Comparator<? super K> comparator() visszaadja a kulcsok összehasonlítóját K firstKey() K lastKey() visszaadja az első/utolsó kulcsot SortedMap<K.V> tailMap(K to) visszaadja a leképzés elejét/közepét/végét Objektumorientált SW-tervezés © BME IIT. ami Iterable Collection<Integer> c = . Goldschmidt Balázs 42 .

.Collections Collection unmodifiableCollection(Collection c) List unmodifiableList(List c) Map unmodifiableMap(Map c) Set unmodifiableSet(Set c) Objektumorientált SW-tervezés © BME IIT.V> CopyOnWriteArrayList<E> Semaphore . Goldschmidt Balázs 127 Konkurens kollekció-elérés 2 Csomagoló osztályok (decorator minta) java.util.concurrent csomagban ConcurrentMap<K.util. Goldschmidt Balázs 129 43 . Objektumorientált SW-tervezés © BME IIT.. Goldschmidt Balázs 128 Read-only kollekciók Kollekciók paraméterként Java: shallow copy → változtatható C++-ban: const kulcsszó java.util.Konkurens kollekció-elérés Több szál esetén fokozott figyelem kell a kollekciókhoz Alap kollekciók nem szálbiztosak Speciális kollekciók a korrekt konkurenciához java.Collections Collection synchronizedCollection(Collection c) List synchronizedList(List c) Map synchronizedMap(Map c) Set synchronizedSet(Set c) SortedMap synchronizedSortedMap(SortedMap c) SortedSet synchronizedSortedSet(SortedSet c) Objektumorientált SW-tervezés © BME IIT.

Goldschmidt Balázs 132 44 . list (from Enumeration). frequency. rotate wrapperek concurrent. reverse. binarySearch sort. Set). singletonList (Map. min. Statikus típus funkcionális követelmények minél absztraktabb legyen tervezésnél erre kell koncentrálni Dinamikus típus nem funkcionális követelmények akár futási időben cserélhető megvalósításnál erre kell koncentrálni Objektumorientált SW-tervezés © BME IIT. shuffle. copy. disjoint max. Goldschmidt Balázs 130 Keretrendszer használata List<Student> s = new ArrayList<Student>().Kollekciókezelés Collections utility osztály emptyList (Map. Goldschmidt Balázs 131 Reflection Objektumorientált SW-tervezés © BME IIT. checked Objektumorientált SW-tervezés © BME IIT. Set) fill. unmodifiable.

forName("java. lehet módosítani.Reflection Lehetővé teszi az osztályok. objektumok elérése osztálymegjelenítők osztályok metainformációinak futási idejű vizsgálata debuggerek. ami sérti az OO elveket Objektumorientált SW-tervezés © BME IIT.getClass() visszaadja az adott objektum osztályát leíró Class objektumot . teszteszközök a futás során az alkalmazás elemeinek ellenőrzése objektumok elérése Objektumorientált SW-tervezés © BME IIT.class visszaadja a boolean primitív típus objektumát String.lang.class elérés boolean.String") visszaadja a String osztályt leíró objektumot Objektumorientált SW-tervezés © BME IIT. amik egyes SecurityManagerek mellett nem állnak rendelkezésre egységbezárás megbontása olyan dolgokat is meg lehet tekinteni. objektumok futási időben történő vizsgálatát és módosítását bővíthetőségi lehetőségek futási időben külső osztályok betöltése. Goldschmidt Balázs 135 45 .class visszaadja a String osztályt leíró objektumot Class.forName() Class. Goldschmidt Balázs 134 Osztályok metainformációi Object. Goldschmidt Balázs 133 Reflection 2 Óvatosan kell vele bánni teljesítményromlás reflection használata megnöveli az erőforrásigényt és a futási időt biztonsági megkötések a reflection használatához engedélyek kellenek.

. Goldschmidt Balázs 138 46 . parameterTypes) Method[] get[Declared]Methods() adott szignatúrájú / összes metódus leírója Objektumorientált SW-tervezés © BME IIT... Goldschmidt Balázs 137 Class<T> metódusai 3 Field get[Declared]Field(String name) Field[] get[Declared]Fields() adott nevű / összes mező leírója Method get[Declared]Method(String name.Class<T> metódusai Class<? super T> getSuperClass() ősosztály leírója Class<?>[] getClasses() Class<?>[] getDeclaredClasses() Class<?>[] getEnclosingClasses() tag/deklarált/beágyazott osztályok leírói Objektumorientált SW-tervezés © BME IIT.. Class<?>.. Goldschmidt Balázs 136 Class<T> metódusai 2 Constructor<T> getConstructor(Class<?>. parameterTypes) adott paraméterű konstruktor leírója Constructor<?>[] getDeclaredConstructors() összes konstruktor leírója Objektumorientált SW-tervezés © BME IIT.. parameterTypes) adott paraméterű publikus konstruktor leírója Constructor<?>[] getConstructors() összes publikus konstruktor leírója Constructor<T> getDeclaredConstructor(Class<?>.

abstract.. amiben a metódus szerepel Object invoke(Object obj. public) kódolva Class<?>[] getParameterTypes() paramétereinek típusa Class<?> getReturnType() visszatérési érték típusa Objektumorientált SW-tervezés © BME IIT. args) metódus meghívása adott objkektumon adott paraméterekkel Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 141 47 . kódolva ..Class<T> metódusai 4 String getName() az osztály neve Package getPackage() az osztály csomagja int getModifiers() az osztály módosítói (public. stb). Object.. Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 140 Method metódusai 2 Class<?>[] getExceptionTypes() kivételek típusa Class<?> getDeclaringClass() az osztály leírója. static. Goldschmidt Balázs 139 Method metódusai String getName() metódus neve int getModifiers() metódus módosítói (pl..

Object value) void setInt(Object obj. Goldschmidt Balázs 142 Kivételkezelés.Field metódusai String getName() attribútum neve Class<?> getType() attribútum típusa Object get(Object obj) int getInt(Object obj) attribútum értékének lekérése (általánosan és primitív típusra) void set(Object obj. int i) attribútum értékének beállítása (általánosan és primitív típusra) Objektumorientált SW-tervezés © BME IIT. putchar(c). Goldschmidt Balázs 143 Kivételkezelés története: C hibajelzés a visszatérési értékben while ((c=getchar()) != EOF) { c = toupper(c). } keveredik a típus és a metatípus setjmp() és longjmp() primitív kivételkezelést ad Objektumorientált SW-tervezés © BME IIT. Felsorolás. Goldschmidt Balázs 144 48 . Vararg Objektumorientált SW-tervezés © BME IIT.

. } Objektumorientált SW-tervezés © BME IIT. csak ez dobható Throwable kötelező definiálni. foo(s). } finally { fis. } catch (IOException e) { . ..) { // minden más ..close(). Goldschmidt Balázs 145 Kivételkezelés története: Java a C++ változaton alapul van saját kivételosztály.Kivételkezelés története: C++ megjelenik a klasszikus kivételkezelés try { . Goldschmidt Balázs 146 Kivételkezelés void foo(String s) throws IOException { … } FileInputStream fis = new FileInputStream(“a”)... } catch (..... } nincs egyértelmű kivétel-típus Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 147 49 .. throw. } catch (E e) { // E típ. RuntimeException. kiv.. try { . Error záró blokk: finally Objektumorientált SW-tervezés © BME IIT.. throw e. mit nem kap el throws elkapandó és nem-elkapandó kivételek is Exception.

} … return ast. NullPointerException Objektumorientált SW-tervezés © BME IIT. } … return ast. Goldschmidt Balázs 148 Láncolt kivételek public AST parseFile(File f) throws ParseException { AST ast = new AST(). throw pe. try { … } catch (IOException e) { ParseException pe = new ParseException(). } Objektumorientált SW-tervezés © BME IIT.printStackTrace().printStackTrace(). } catch (ParseException pe) { pe.Kivételek hierarchiája Throwable programhiba lehet rá készülni kötelező elkapni pl. Goldschmidt Balázs 150 50 . Goldschmidt Balázs 149 Láncolt kivételek 2 public AST parseFile(File f) throws ParseException { AST ast = new AST(). } catch (ParseException pe) { pe. pe.initCause(e). } try { ast = parseFile(f). } try { ast = parseFile(f). LinkageError programhiba zajt vinne a kódba RuntimeException nem kell elkapni pl. } Objektumorientált SW-tervezés © BME IIT. try { … } catch (IOException e) { ParseException pe = new ParseException(). throw pe. InterruptedException Exception Error rendszerhiba nem lehet rá készülni nem kell elkapni pl.

toUpperCase ()... public String toString () { return String.io..parseFile(Test2.valueOf (m_value). } private Object readResolve () throws java.4 óta beállítható egy cause a stack-trace-ben is megjelenik Objektumorientált SW-tervezés © BME IIT. public static final int VIDOR = 1. … Nem típusérzékeny minden int Módosítás újrafordítást igényel Kiíratás nem informatív Objektumorientált SW-tervezés © BME IIT. } private boolean m_value.ObjectStreamException { return (m_value ? TRUE : FALSE). } // end of class Objektumorientált SW-tervezés © BME IIT. Goldschmidt Balázs 151 Enum: integerekkel Enum intekkel public static final int TUDOR=0.Láncolt kivételek 3 ParseException at Test2. } private Enum (boolean value) { m_value = value. Goldschmidt Balázs 152 Enum: pattern Typesafe enum pattern public final class Enum implements java. Caused by: IOException at Test2.java:19) .Serializable { public static final Enum TRUE = new Enum (true).java:17) a Throwable-ben Java 1. public static final int HAPCI = 2. at Test2.. Goldschmidt Balázs 153 51 .nextString(Test2. public static final Enum FALSE = new Enum (false).parseFile(Test2.java:12) .io.

out.out.println(“A!”).5) saját osztállyal attribútumokkal metódusokkal szerializálható kiíratható rövid for ciklus működik switch-case működik Objektumorientált SW-tervezés © BME IIT.println(t+": "+t. } } for (Törpe t : Törpe. Goldschmidt Balázs 155 Enum példa 2 enum Betuk {A. } Objektumorientált SW-tervezés © BME IIT. SZENDI(90).println(“B!”). Goldschmidt Balázs 156 52 .ének()). case B: System. } Objektumorientált SW-tervezés © BME IIT.B) { . KUKA(10). } public String ének() { return "-Hejhó! -"+iq.out. MORGÓ. B.Enum: valódi típus valódi felsorolás típus (Java 1. SZENDI. KUKA } public enum Törpe { TUDOR(210). MORGÓ(170). HAPCI(110). switch (e) { case A: System. HAPCI. VIDOR. VIDOR(120). break. SZUNDI.out. break.. Törpe(int i) { iq = i.values()) { System. } if (e == Betuk.println(“C!”). Goldschmidt Balázs 154 Enum példa public enum Törpe { TUDOR.. private final int iq. SZUNDI(95). break. } public int iq { return iq. case C: System. C} Betuk e = Betuk.A.

Object… oa) { for (Object o : oa) …. foo("X". "l".. "c"}. "n"). Object[] oa) { for (Object o : oa) …. "m". } Object[] oo = {"a". Goldschmidt Balázs 159 53 ..Enum metódusai String name() enum konstans neve int ordinal() konstans sorszáma static <T extends Enum<T>> T valueOf([Class<T> enumType. } ezek a metódusok csak a konkrét enum típuson értelmesek Objektumorientált SW-tervezés © BME IIT.5: tömböt kellett átadni kényelmetlen void foo(String s. Objektumorientált SW-tervezés © BME IIT. "j". "b". Goldschmidt Balázs 157 Enum genericitása Enum<E extends Enum<E>> enumot csak enum leszármazottjával lehet paraméterezni speciális metódusokat örököl public final int compareTo(E o){ . foo("X". } 1. oo). Goldschmidt Balázs 158 Változó hosszúságú paraméterlista Pre 1.5: varargs tömbként és felsorolva is átadható csak a paraméterlista végén állhat void foo(String s. "k".] String name) adott [típusú és] nevű konstanst ad vissza static <T extends Enum<T>> T[] values() az enum típus konstansait adja vissza Objektumorientált SW-tervezés © BME IIT.