Java 5. Ráth István

Hasonló dokumentumok
List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Collections. Összetett adatstruktúrák

J2SE 1.5 Tiger. Bevezetés. Metaadatok. Generikus típus. J2SE 1.5 Tiger. Viczián István (viczian.istvan a gmail-en)

Java bevezet o Kab odi L aszl o Kab odi L aszl o Java bevezet o

Programozási nyelvek Java

Programozási nyelvek Java

Magas szintű programozási nyelvek 2 Előadás jegyzet

Mi a különbség az extends és az implements között. Mikor melyiket kell használni? Comperable-t megvalósító oasztályokban össze lehet hasonlitani

Programozási nyelvek Java

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Szoftvertechnológia alapjai Java előadások

Bánsághi Anna

Segédanyag: Java alkalmazások gyakorlat

Tartalom. Az EJB 2.1 problémái Az EJB 3 megoldásai

C#, OOP. Osztályok tervezése C#-ban

C# versus Java. Óbudai Egyetem, Java Standard Edition Mérnök Informatikus szak, BSc Labor 3. Bedők Dávid v0.4

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Segédanyag: Java alkalmazások gyakorlat

Kivételkezelés, naplózás. Exception handling, logging

Java és web programozás

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Programozási technológia

Programozási nyelvek II.: JAVA

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++

Dinamikus adatszerkezetek. 2D generikus tömb: C++ 2D generikus tömb: C++ 2D tömb: Java versus C++ 2D tömb: Java.

JNDI - alapok. Java Naming and Directory Interface

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Abstract osztályok és interface-ek. 7-dik gyakorlat

Tulajdonságalapú tesztelés

Újdonságok a Java nyelvben

Programozási nyelvek JAVA EA+GY 1. gyakolat

Önelemzés és a JavaBean komponensmodell

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

CREATE TABLE student ( id int NOT NULL GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name varchar(100) NOT NULL, address varchar(100) NOT NULL )

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Szoftvertechnológia alapjai Java előadások

Java és web programozás

Generikus Típusok, Kollekciók

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Gelle Kitti Algoritmusok és adatszerkezetek gyakorlat - 07 Hasítótáblák

Java és web programozás

Adatbázisok webalkalmazásokban

Generikus osztályok, gyűjtemények és algoritmusok

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Programozási technológia

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Osztályok. 4. gyakorlat

Informatika terméktervezőknek

ZH mintapélda. Feladat. Felület

Segédanyag: Java alkalmazások gyakorlat

Programozási nyelvek Java

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

és az instanceof operátor

Java programozási nyelv 4. rész Osztályok II.

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Fordított és szkript nyelvek összehasonlító elemzése. Sergyán Szabolcs

Javadoc. Dokumentációs megjegyzés (2) Dokumentációs megjegyzés (1) Dokumentációs megjegyzés felépítése

Stateless Session Bean

A WEB programozása - JSP1 dr.gál Tibor őszi félév

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

OOP: Java 8.Gy: Abstract osztályok, interfészek

Web-technológia PHP-vel

Osztályszintű elérés, kivételkezelés, fájlkezelés

Kalapácsvetés 2016 szöveges

WEBFEJLESZTÉS 2. ADATBÁZIS-KEZELÉS, OSZTÁLYOK

Szálkezelés. Melyik az a hívás, amelynek megtörténtekor már biztosak lehetünk a deadlock kialakulásában?

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

JAVA nyelvi alapok. Adatbányászati technikák (VISZM185) Dávid István

.Net adatstruktúrák. Készítette: Major Péter

Objektumorientált programozás C# nyelven

Java és web programozás

Java és web programozás

Vé V g é r g e r h e a h j a tá t s á i s s z s ál á ak a Runnable, Thread

A Java és a C++ összehasonlítása

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

Java programozási nyelv

Programozási nyelvek Java

Overview. Service. Application Activity Activity 2 Activity 3. Fragment. Fragment. Fragment. Frag ment. Fragment. Broadcast Receiver

Objektumorientált programozás C# nyelven

Java IX. telkezelés a Java-ban

ios alkalmazásfejlesztés Koltai Róbert

Java IX. telkezelés a Java-ban

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

OOP: Java 1.Gy: Java alapok

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

Programozási nyelvek Java

JAVA PROGRAMOZÁS 3.ELŐADÁS

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

A legalacsonyabb szintű tesztelés. A programot felépítő egységek tesztelése Unit: egy rendszer legkisebb önálló egységként tesztlehető része.

Programozási nyelvek II.: JAVA

Komponensek együttműködése web-alkalmazás környezetben. Jónás Richárd Debreceni Egyetem T-Soft Mérnökiroda KFT

Előszó. Bevezetés. Java objektumok leképzése relációs adatbázisokra OJB-vel Viczián István Viczián István

Átírás:

Java 5 Ráth István rath@mit.bme.hu

Áttekintés Java 5 újdonságai Generikus nyelvi eszközök Foreach Dobozolás Enumerációk Varargs Annotációk Kitekintés: Java 6 eszközök

Generikus típusok Cél Osztályok, metódusok konkrét típusmegkötés nélkül, mégis fordítási időben ellenőrzött (statikus) típushelyességgel Vö: dinamikus tipizálás (java.lang.object, casting) Megvalósítás: JSR-14 Ős: generikus (meta)programozás, C++ template Java: szűkített részhalmaz, containers-of-type- T (~STL Container) Referencia http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf

Generikus konténerek Típus nélküli konténerek // Removes 4-letter words from c. // Elements must be strings static void expurgate(collection c) for (Iterator i = c.iterator(); i.hasnext(); ) if (((String) i.next()).length() == 4) i.remove (); // ClassCastException possible!

Generikus konténerek 2 Típusos konténerek // Removes the 4-letter words from c static void expurgate(collection<string> c) for (Iterator<String> i = c.iterator(); i.hasnext (); ) if (i.next().length() == 4) i.remove();

Generikus konténerek 2 Típusos konténerek // Removes the 4-letter words from c static void expurgate(collection<string> c) for (Iterator<String> i = c.iterator(); i.hasnext (); ) if (i.next().length() == 4) i.remove(); Olyan általános kollekció, amely String elemeket tartalmazhat

Generikus konténerek 2 Típusos konténerek // Removes the 4-letter words from c static void expurgate(collection<string> c) for (Iterator<String> i = c.iterator(); i.hasnext (); ) if (i.next().length() == 4) i.remove(); Olyan iterátor, amelynek.next() metódusa String elemeket ad vissza Olyan általános kollekció, amely String elemeket tartalmazhat

Generikus konténerek 3 Miért jó mindez? Kevesebb cast, kevesebb zárójel = áttekinthetőbb kód Nagyobb biztonság: statikus típushelyesség vizsgálat (nincs ClassCastException)

Generikus konténerek 4 Hogyan készíthetünk ilyeneket? public interface List<E> void add(e x); Iterator<E> iterator(); public interface Iterator<E> E next(); boolean hasnext();

Generikus konténerek 4 Hogyan készíthetünk ilyeneket? public interface List<E> Fontos megjegyzés! public interface Iterator<E> void add(e x); E next(); Iterator<E> iterator(); boolean hasnext(); Iterator<Integer> i = c.iterator(); javac public interface Iterator<E> E next(); public interface IteratorInteger boolean hasnext(); Integer next(); boolean hasnext();

Generikus konténerek 4 Hogyan készíthetünk ilyeneket? public interface List<E> Fontos megjegyzés! public interface Iterator<E> void add(e x); E next(); Iterator<E> iterator(); boolean hasnext(); Iterator<Integer> i = c.iterator(); javac public interface Iterator<E> E next(); public interface IteratorInteger boolean hasnext(); Integer next(); boolean hasnext();

Generikus konténerek 5

Generikus konténerek 5 List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok Lehet ilyet? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok Lehet ilyet? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok Lehet ilyet? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok Lehet ilyet? Miért? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error!

Generikus konténerek 5 További apróságok Lehet ilyet? Miért? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error! lo.add(new Object()); String s = ls.get(0); // attempts to assign an Object to a // String!

Generikus konténerek 5 További apróságok Lehet ilyet? Általánosságban: Miért? List<String> ls = new ArrayList<String>(); List<Object> lo = ls; // Compile error! Object List<Object> lo.add(new Object()); String s = ls.get(0); // attempts to assign an Object to a // String! String List<String>

Generikus konténerek 6 Wildcards // Generify! void printcollection(collection c) Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) System.out.println(i.next());

Generikus konténerek 6 Wildcards // Generified Generify! void printcollection(collection<?> c) c) for Iterator (Object i = e c.iterator(); : c) for (k = 0; k < c.size(); k++) System.out.println(e); System.out.println(i.next());

Generikus konténerek 7 Bounded wildcards // Generified and bounded void printcollection(collection<? extends Base> c) for (Base b : c) System.out.println(b.someMethod()); // Base: upper bound

Generikus konténerek 7 Bounded wildcards // interface Generified Comparator<T> and bounded void printcollection(collection<? extends Base> c) int compare(t fst, T snd); for (Base b : c) interface System.out.println(b.someMethod()); TreeSet<E> // setcomparator(comparator<? Base: upper bound super E> c); // E: lower bound

Generikus konténerek 8

Generikus konténerek 8 static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? Helyette: static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error

Generikus konténerek 8 Generikus metódusok Lehet ilyet? Helyette: static void fromarraytocollection(object[] a, Collection<?> c) for (Object o : a) c.add(o); // compile error static <T> void fromarraytocollection(t[] a, Collection<T> c) for (T o : a) c.add(o);

Generikus konténerek 9 Generikus kód és régi kód keveredik public class Inventory public static void addassembly(string name, Collection parts)... public static Assembly getassembly(string name)... public interface Assembly Collection getparts();

Generikus konténerek 9 Generikus kód és régi kód keveredik public class Inventory public public static class void addassembly(string Main name, Collection parts)... public static void main(string[] args) public static Assembly getassembly(string name)... Collection<Part> c = new ArrayList<Part>(); c.add(new Guillotine()); // implements Part public interface c.add(new Assembly Blade()); // implements Part Inventory.addAssembly( thingee, c); //?! (1) Collection Collection<Part> getparts(); k = Inventory.getAssembly( thingee ).getparts(); //?! (2)

Generikus konténerek 9 Generikus kód és régi kód keveredik public class Inventory public static void addassembly(string name, Collection parts)... public static Assembly getassembly(string name)... public interface Assembly Collection getparts();

Generikus konténerek 9 Generikus kód és régi kód keveredik public class Inventory public static void addassembly(string name, Collection parts)... public static Assembly getassembly(string name)... public interface Assembly Collection getparts(); Raw type

Generikus konténerek 9 Generikus kód és régi kód keveredik public class Inventory public static void addassembly(string name, Collection parts)... public static Assembly getassembly(string name)... public interface Assembly Collection getparts(); Raw type Unchecked warning

Generikus konténerek 10

Generikus konténerek 10 public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? Miért? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)!

Generikus konténerek 10 Egy utolsó apróság Lehet ilyet? public String loophole(integer x) List<String> ys = new LinkedList<String>(); List xs = ys; xs.add(x); // (1) return ys.iterator().next(); // (2) // unchecked warning (1) // and ClassCastException! // but on which call? // (2)! Miért? Erasure: típusinformáció törlődik fordítás után, és castok jönnek be a megfelelő helyekre

Generikus konténerek 11 Egy hasznos trükk Mi történik akkor, ha öröklött kód raw typeként használja a típusos kollekciónkat? Avagy hogyan kerülhető ki az előző késői ClassCastException? Így:

Generikus konténerek 11 Egy hasznos trükk Mi történik akkor, ha öröklött kód raw typeként használja a típusos kollekciónkat? Avagy hogyan kerülhető ki az előző késői ClassCastException? Így: public String loophole(integer x) List<String> ys = Collections.checkedList( new LinkedList<String>(), String.class); List xs = ys; xs.add(x); // ClassCastException return ys.iterator().next();

Egyéb generikus nyelvi lehetőségek

Egyéb generikus nyelvi lehetőségek ThreadLocal<Context> threadlocal = new ThreadLocal<Context>(); void dosomethingincontext(context c) Context previous = threadlocal.get(); threadlocal.set(c); try dosomething(); finally threadlocal.set(previous);

Egyéb generikus nyelvi lehetőségek

Egyéb generikus nyelvi lehetőségek csomagoló osztályok (ThreadLocal) java.lang.class type tokens String.class à Class<String> Például:

Egyéb generikus nyelvi lehetőségek csomagoló osztályok (ThreadLocal) java.lang.class type tokens String.class à Class<String> Például: public static <T> Collection<T> select (Class<T>c, String sqlstatement) Collection<T> result = new ArrayList<T>(); /* run sql query using jdbc */ for ( /* iterate over jdbc results */ ) T item = c.newinstance(); /* use reflection and set all of item s fields from sql results */ result.add(item); return result;

Foreach void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel();

Foreach A régi módszer Ehelyett void cancelall(collection<timertask> c) Iterator<TimerTask> i = c.iterator(); while (i.hasnext()) i.next().cancel(); void cancelall(collection<timertask> c) for (TimerTask t : c) t.cancel();

Foreach 2 Beágyazott ciklusok Helyesen: for (Suit s: suits) for (Rank r: ranks) sorteddeck.add(new Card(s, r));

Foreach 2 Beágyazott ciklusok for (Iterator i = suits.iterator(); i.hasnext(); ) for (Iterator j = ranks.iterator(); j.hasnext(); ) sorteddeck.add(new Card(i.next(), j.next())); // NoSuchElementException Helyesen: for (Suit s: suits) for (Rank r: ranks) sorteddeck.add(new Card(s, r));

Foreach 3

Foreach 3 int sum(int[] a) int result = 0; for (int i : a) result += i; return result;

Foreach 3 Tömbökkel is működik Mikor nem használhatjuk? Filterezés Több kollekció párhuzamos olvasása int sum(int[] a) int result = 0; for (int i : a) result += i; return result;

Dobozolás (Autoboxing) Set s = new HashSet(); s.add(1); s.add(true);

Dobozolás (Autoboxing) Lehet ilyet? Most már lehet. Dobozolás: primitív típusok és objektum Set s = new HashSet(); s.add(1); s.add(true); megfelelőik közötti automatikus oda-vissza konverzió Mire jó? felesleges kódtól szabadít meg De milyen áron?

Dobozolás 2 Óvatosan használjuk: Integer, Boolean lehet null à kidobozolásnál jöhet NullPointerException == jelentése: Érték szerinti összehasonlítás primitívekre Referencia egyenlőség szerinti összehasonlítás objektumokra Mikor ne használjuk? Ha sebesség kell.

Enumerációk public static final int ENUM_LIT1 = 0; public static final int ENUM_LIT2 = 1; public static final int ENUM_LIT3 = 2;

Enumerációk Enumeráció szerűség Java-ban eddig: public static final int ENUM_LIT1 = 0; public static final int ENUM_LIT2 = 1; public static final int ENUM_LIT3 = 2; Mi ezzel a baj? Nem biztonságos (int) Nem illeszkedik a Java névtérbe (ENUM_) Körülményes a módosítás (próbáljunk újat felvenni két érték közé ) Debug célú print() eredménye egy szám.

Enumerációk 2 Mostantól: enum Season WINTER, SPRING, SUMMER, FALL Tudja a hagyományos enum funkciókat Switch()-be tehető Mennyivel több ez C(++ / #) enumnál? Ez egy valódi osztály! (enum type) Lehetnek metódusai, tagváltozói Megvalósíthat interfészeket, öröklődhet Értelmes.toString(), stb. megvalósításokat tartalmaz Comparable, Serializable Statikus.values() metódus az összes érték lekéréséhez

Enumerációk 3 További trükkök public enum Operation PLUS double eval(double x, double y) return x + y;, MINUS double eval(double x, double y) return x - y;, TIMES double eval(double x, double y) return x * y;, DIVIDE double eval(double x, double y) return x / y; ; // Do arithmetic op represented by this constant abstract double eval(double x, double y); // constant-specific methods

Enumerációk 4 További trükkök for (Day d : EnumSet.range(Day.MONDAY, Day.FRIDAY)) System.out.println(d); // use java.util.enumset for fast set operations on enums, // including:.allof,.noneof,.complementof // use.of instead of traditional bit flags: EnumSet.of(Style.BOLD, Style.ITALIC); // use java.util.enummap for fast enum-keyed maps private static Map<Suit, Map<Rank, Card>> table = new EnumMap<Suit, Map<Rank, Card>>(Suit.class);

Változó argumentumszámú metódusok

Változó argumentumszámú metódusok String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[]

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[]

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); Hogyan kell ilyet deklarálni? String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[]

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); Hogyan kell ilyet deklarálni? String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[]

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); Hogyan kell ilyet deklarálni? String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[]

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); Hogyan kell ilyet deklarálni? String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[] És használni?

Változó argumentumszámú metódusok System.out.printf("%d %d", 1,2); Hogyan kell ilyet deklarálni? String format(string pattern, Object... arguments); // use varargs only in the final argument! // treat arguments as an Object[] És használni? format( %d %d,1,2); format( %d %d,new Object[]1,2); // pass arguments as an Object[] OR // as a sequence of arguments

Annotációk (metaadatok) Annotáció = a kód egy meghatározott részletéhez ragasztott címke Mire jó? Dokumentáció Származtatott (generált) kód (fájlok) előállításának vezérlésére segítésére Jó példa: (web) deployment descriptor

Annotációk 2

Annotációk 2 Nincs már erre eszköz? (JavaDoc?) Dehogynem: (JavaDoc J ) Az annotációk először itt jelentek meg

Annotációk 2 Nincs már erre eszköz? (JavaDoc?) Dehogynem: (JavaDoc J ) Az annotációk először itt jelentek meg @author, @deprecated, @return, @param, @throws, @see, Mi ezzel a baj?

Annotációk 2 Nincs már erre eszköz? (JavaDoc?) Dehogynem: (JavaDoc J ) Az annotációk először itt jelentek meg @author, @deprecated, @return, @param, @throws, @see, Mi ezzel a baj? Kommentben vannak à elsősorban dokumentációs célra alkalmas Miben tudnak a Java 5 annotációk többet? Részei nemcsak a forrásnak, hanem a class fájloknak is Reflectionnel kiolvashatók speciális nyelvi elemek, bővíthető APIval

Annotációk 2 Nincs már erre eszköz? (JavaDoc?) Dehogynem: (JavaDoc J ) Az annotációk először itt jelentek meg @author, @deprecated, @return, @param, @throws, @see, Mi ezzel a baj? Kommentben vannak à elsősorban dokumentációs célra alkalmas Miben tudnak a Java 5 annotációk többet? Részei nemcsak a forrásnak, hanem a class fájloknak is Reflectionnel kiolvashatók speciális nyelvi elemek, bővíthető APIval apt: Annotation Processing Tool

Annotációk 2 Nincs már erre eszköz? (JavaDoc?) Dehogynem: (JavaDoc J ) Az annotációk először itt jelentek meg @author, @deprecated, @return, @param, @throws, @see, Mi ezzel a baj? Kommentben vannak à elsősorban dokumentációs célra alkalmas Fontos! Miben tudnak a Java 5 annotációk többet? Részei nemcsak a forrásnak, hanem a class fájloknak is Reflectionnel kiolvashatók speciális nyelvi elemek, bővíthető APIval apt: Annotation Processing Tool Az annotációk NEM közvetlenül módosítják a program viselkedését, mint a többi nyelvi elem. Sokkal inkább a programot feldolgozó és futtató környezet viselkedését befolyásolhatják.

Annotációk 3 Hogyan deklaráljunk egy címkét? /** * Describes the Request-For-Enhancement(RFE) that led * to the presence of the annotated API element. */ public @interface RequestForEnhancement int id(); String synopsis(); String engineer() default "[unassigned]"; String date() default "[unimplemented]";

Annotációk 3 Hogyan deklaráljunk egy címkét? /** * Describes the Request-For-Enhancement(RFE) that led * to the presence of the annotated API element. */ public @interface RequestForEnhancement Minden metódus a címke egyegy elemét jelöli. int id(); String synopsis(); Nem szabad paramétereket String engineer() default használni, "[unassigned]"; illetve throws klózt. String date() default "[unimplemented]"; Lehetséges visszatérési értékek: primitívek, String, Class, enumerációk, annotációk, és ezek tömbjei.

Annotációk 4 Hogyan használjunk egy címkét? @RequestForEnhancement( id = 2868724, synopsis = "Enable time-travel", engineer = "Mr. Peabody", date = "4/1/3007" ) public static void travelthroughtime(date destination)... @Preliminary // marker annotation, no elements public class TimeTravel... // annotation with a single element public @interface Copyright String value(); // should be named value @Copyright("2002 Yoyodyne Propulsion Systems") public class OscillationOverthruster...

Annotációk 5 Meta-annotációk az annotációk annotációi import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test

Annotációk 5 Meta-annotációk az annotációk annotációi import java.lang.annotation.*; Jelzi, hogy ezt az annotációt meg kell tartani futási időben is, hogy reflektíven ki tudjuk olvasni. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test

Annotációk 5 Meta-annotációk az annotációk annotációi import java.lang.annotation.*; Jelzi, hogy ezt az annotációt meg kell tartani futási időben is, hogy reflektíven ki tudjuk olvasni. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface Test Jelzi, hogy ezt az annotációt csak metódusok címkézésére használhatjuk.

Annotációk 6 Teszt keretrendszer import java.lang.annotation.*; import java.lang.reflect.*; public class RunTests public static void main(string[] args) throws Exception for (Method m : Class.forName(args[0]).getMethods()) if (m.isannotationpresent(test.class)) try m.invoke(null); catch (Throwable ex) System.out.printf("%s failed: %s %n", m, ex.getcause());

Teszt keretrendszer import java.lang.annotation.*; import java.lang.reflect.*; public class RunTests Annotációk 6 Végigmegyünk a tesztosztályból példányosított objektum metódusain, reflexióval. public static void main(string[] args) throws Exception for (Method m : Class.forName(args[0]).getMethods()) if (m.isannotationpresent(test.class)) try m.invoke(null); catch (Throwable ex) System.out.printf("%s failed: %s %n", m, ex.getcause());

Teszt keretrendszer import java.lang.annotation.*; import java.lang.reflect.*; public class RunTests Annotációk 6 public static void main(string[] args) throws Exception for (Method m : Class.forName(args[0]).getMethods()) if (m.isannotationpresent(test.class)) try m.invoke(null); catch (Throwable ex) Végigmegyünk a tesztosztályból példányosított objektum metódusain, reflexióval. System.out.printf("%s failed: %s %n", Ha m, @Test ex.getcause()); címkével jelzett metódust találunk, meghívjuk.

Annotációk 7 Annotation Processing Tool (apt) Célja: automatizáljuk a címkézett programok fordítását Fordítási időben készít egy read-only nézetet a programunkról, Amit saját osztályokkal feldolgozhatunk (további kód generálása, egyéb fájlok létrehozása).

Annotációk 8 Annotation Processing Tool (apt) Read-only nézet: Java programok absztrakciója, a Mirror API alapján (com.sun.mirror.declaration) Ezt annotation processorok dolgozzák fel (com.sun.mirror.apt), a visitor minta alapján Ha új forráskód jött létre, rekurzívan folytatódik a feldolgozás

Kitekintés: Java 6 Collections keretrendszer új elemei Deque (két irányból módosítható várakozási sor) NavigableSet (megkereshetjük a keresési kulcshoz adott szempontból legközelebbi találatot) NavigableMap (hasonlóan)

Kitekintés 2 IO java.io.console (.printf (),.readline(),.readpassword() ) System.console() Networking Beépített pehelysúlyú HTTP(S) szerver Beágyazott webserverek készítéséhez (~servlet szerű absztrakció)

Kitekintés 3 Scripting Egyszerű script fordítókat ültethetünk rá a Java alkalmazásunkra Keverhető a Java és JavaScript forráskód JConsole A JMX API-n keresztül monitorozhatjuk a VMeinkben futó Java alkalmazásokat