java 5 - inf.mit.bme.hu · pdf file• java 5 újdonságai – generikus...
TRANSCRIPT
![Page 2: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/2.jpg)
Á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
![Page 3: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/3.jpg)
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
![Page 4: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/4.jpg)
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!
![Page 5: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/5.jpg)
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();
}
![Page 6: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/6.jpg)
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
![Page 7: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/7.jpg)
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
Olyan iterátor, amelynek .next()
metódusa String elemeket ad vissza
![Page 8: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/8.jpg)
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)
![Page 9: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/9.jpg)
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();}
![Page 10: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/10.jpg)
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();}
Fontos megjegyzés!public interface Iterator<E> { E next(); boolean hasNext();}
public interface IteratorInteger { Integer next(); boolean hasNext();}
javac
Iterator<Integer> i = c.iterator();
![Page 11: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/11.jpg)
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();}
Fontos megjegyzés!public interface Iterator<E> { E next(); boolean hasNext();}
public interface IteratorInteger { Integer next(); boolean hasNext();}
javac
Iterator<Integer> i = c.iterator();
![Page 12: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/12.jpg)
Generikus konténerek 5
![Page 13: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/13.jpg)
Generikus konténerek 5
List<String> ls = new ArrayList<String>();List<Object> lo = ls;// Compile error!
![Page 14: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/14.jpg)
Generikus konténerek 5
• További „apróságok”
List<String> ls = new ArrayList<String>();List<Object> lo = ls;// Compile error!
![Page 15: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/15.jpg)
Generikus konténerek 5
• További „apróságok”– Lehet ilyet?
List<String> ls = new ArrayList<String>();List<Object> lo = ls;// Compile error!
![Page 16: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/16.jpg)
Generikus konténerek 5
• További „apróságok”– Lehet ilyet?
List<String> ls = new ArrayList<String>();List<Object> lo = ls;// Compile error!
![Page 17: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/17.jpg)
Generikus konténerek 5
• További „apróságok”– Lehet ilyet?
List<String> ls = new ArrayList<String>();List<Object> lo = ls;// Compile error!
![Page 18: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/18.jpg)
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!
![Page 19: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/19.jpg)
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!
![Page 20: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/20.jpg)
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!
Általánosságban:
String
Object
List<String>
List<Object>
![Page 21: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/21.jpg)
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()); }}
![Page 22: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/22.jpg)
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()); }}
// Generifiedvoid printCollection(Collection<?> c) { for (Object e : c) { System.out.println(e); }}
![Page 23: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/23.jpg)
Generikus konténerek 7
• Bounded wildcards
// Generified and boundedvoid printCollection(Collection<? extends Base> c) { for (Base b : c) { System.out.println(b.someMethod()); }}// Base: upper bound
![Page 24: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/24.jpg)
Generikus konténerek 7
• Bounded wildcards
// Generified and boundedvoid printCollection(Collection<? extends Base> c) { for (Base b : c) { System.out.println(b.someMethod()); }}// Base: upper bound
interface Comparator<T> { int compare(T fst, T snd);}
interface TreeSet<E>
{
setComparator(Comparator<? super E> c);
}// E: lower bound
![Page 25: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/25.jpg)
Generikus konténerek 8
![Page 26: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/26.jpg)
Generikus konténerek 8
static void fromArrayToCollection(Object[] a, Collection<?> c) { for (Object o : a) { c.add(o); }}// compile error
![Page 27: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/27.jpg)
Generikus konténerek 8
• Generikus metódusok
static void fromArrayToCollection(Object[] a, Collection<?> c) { for (Object o : a) { c.add(o); }}// compile error
![Page 28: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/28.jpg)
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
![Page 29: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/29.jpg)
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
![Page 30: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/30.jpg)
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
![Page 31: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/31.jpg)
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
![Page 32: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/32.jpg)
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
![Page 33: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/33.jpg)
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
![Page 34: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/34.jpg)
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); }}
![Page 35: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/35.jpg)
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();}
![Page 36: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/36.jpg)
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();}
public class Main { public static void main(String[] args) { Collection<Part> c = new ArrayList<Part>(); c.add(new Guillotine()); // implements Part c.add(new Blade()); // implements Part Inventory.addAssembly(”thingee”, c); // ?! (1) Collection<Part> k = Inventory.getAssembly(”thingee”).getParts(); // ?! (2) }}
![Page 37: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/37.jpg)
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();}
![Page 38: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/38.jpg)
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();}
Rawtype
![Page 39: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/39.jpg)
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();}
Rawtype
Unchecked warning
![Page 40: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/40.jpg)
Generikus konténerek 10
![Page 41: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/41.jpg)
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)!
![Page 42: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/42.jpg)
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)!
![Page 43: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/43.jpg)
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)!
![Page 44: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/44.jpg)
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)!
![Page 45: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/45.jpg)
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)!
![Page 46: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/46.jpg)
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)!
![Page 47: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/47.jpg)
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)!
![Page 48: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/48.jpg)
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)!
![Page 49: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/49.jpg)
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)!
![Page 50: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/50.jpg)
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)!
![Page 51: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/51.jpg)
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)!
![Page 52: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/52.jpg)
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)!
![Page 53: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/53.jpg)
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)!
![Page 54: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/54.jpg)
Generikus konténerek 10• Egy utolsó apróság…
– Lehet ilyet?
– Miért?• Erasure: típusinformáció törlődik fordítás után, és castok
jönnek be a megfelelő helyekre
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)!
![Page 55: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/55.jpg)
Generikus konténerek 11
• Egy hasznos trükk– Mi történik akkor, ha „öröklött” kód raw type-
ként használja a típusos kollekciónkat?– Avagy hogyan kerülhető ki az előző „késői”
ClassCastException?• Így:
![Page 56: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/56.jpg)
Generikus konténerek 11
• Egy hasznos trükk– Mi történik akkor, ha „öröklött” kód raw type-
ké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();}
![Page 57: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/57.jpg)
Egyéb generikus nyelvi lehetőségek
![Page 58: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/58.jpg)
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); } }
![Page 59: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/59.jpg)
Egyéb generikus nyelvi lehetőségek
![Page 60: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/60.jpg)
Egyéb generikus nyelvi lehetőségek
• „csomagoló” osztályok (ThreadLocal)• java.lang.Class type tokens
– String.class à Class<String>– Például:
![Page 61: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/61.jpg)
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;}
![Page 62: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/62.jpg)
Foreach
void cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 63: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/63.jpg)
Foreach
• A régi módszervoid cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 64: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/64.jpg)
Foreach
• A régi módszervoid cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 65: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/65.jpg)
Foreach
• A régi módszervoid cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 66: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/66.jpg)
Foreach
• A régi módszervoid cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 67: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/67.jpg)
Foreach
• A régi módszervoid cancelAll(Collection<TimerTask> c){ Iterator<TimerTask> i = c.iterator(); while (i.hasNext()) { i.next().cancel(); }}
![Page 68: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/68.jpg)
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();}
![Page 69: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/69.jpg)
Foreach 2
• Beágyazott ciklusok…
• Helyesen:for (Suit s: suits) for (Rank r: ranks) sortedDeck.add(new Card(s, r));
![Page 70: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/70.jpg)
Foreach 2
• Beágyazott ciklusok…
• Helyesen:
for (Iterator i = suits.iterator(); i.hasNext(); ) for (Iterator j = ranks.iterator(); j.hasNext(); ) sortedDeck.add(new Card(i.next(), j.next())); // NoSuchElementException
for (Suit s: suits) for (Rank r: ranks) sortedDeck.add(new Card(s, r));
![Page 71: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/71.jpg)
Foreach 3
![Page 72: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/72.jpg)
Foreach 3int sum(int[] a) { int result = 0; for (int i : a) result += i; return result; }
![Page 73: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/73.jpg)
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; }
![Page 74: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/74.jpg)
Dobozolás (Autoboxing)Set s = new HashSet();s.add(1); s.add(true);
![Page 75: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/75.jpg)
Dobozolás (Autoboxing)
• Lehet ilyet?• Most már lehet.
– Dobozolás: primitív típusok és objektum megfelelőik közötti automatikus oda-vissza konverzió
• Mire jó?– „felesleges” kódtól szabadít meg– De milyen áron?
Set s = new HashSet();s.add(1); s.add(true);
![Page 76: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/76.jpg)
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.
![Page 77: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/77.jpg)
Enumerációk
public static final int ENUM_LIT1 = 0; public static final int ENUM_LIT2 = 1;public static final int ENUM_LIT3 = 2;
![Page 78: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/78.jpg)
Enumerációk
• Enumeráció „szerűség” Java-ban eddig:
• 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.
public static final int ENUM_LIT1 = 0; public static final int ENUM_LIT2 = 1;public static final int ENUM_LIT3 = 2;
![Page 79: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/79.jpg)
Enumerációk 2• Mostantól:
• 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
enum Season { WINTER, SPRING, SUMMER, FALL }
![Page 80: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/80.jpg)
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
![Page 81: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/81.jpg)
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 mapsprivate static Map<Suit, Map<Rank, Card>> table = new EnumMap<Suit, Map<Rank, Card>>(Suit.class);
![Page 82: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/82.jpg)
Változó argumentumszámú metódusok
![Page 83: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/83.jpg)
Változó argumentumszámú metódusok
String format(String pattern, Object... arguments); // use varargs only in the final argument!// treat arguments as an Object[]
![Page 84: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/84.jpg)
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[]
![Page 85: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/85.jpg)
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[]
![Page 86: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/86.jpg)
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[]
![Page 87: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/87.jpg)
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[]
![Page 88: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/88.jpg)
Változó argumentumszámú metódusok
• System.out.printf("%d %d", 1,2);• Hogyan kell ilyet deklarálni?
• És használni?
String format(String pattern, Object... arguments); // use varargs only in the final argument!// treat arguments as an Object[]
![Page 89: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/89.jpg)
Változó argumentumszámú metódusok
• System.out.printf("%d %d", 1,2);• Hogyan kell ilyet deklarálni?
• És használni?
String format(String pattern, Object... arguments); // use varargs only in the final argument!// treat arguments as an Object[]
format(”%d %d”,1,2);format(”%d %d”,new Object[]{1,2}); // pass arguments as an Object[] OR// as a sequence of arguments
![Page 90: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/90.jpg)
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
![Page 91: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/91.jpg)
Annotációk 2
![Page 92: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/92.jpg)
Annotációk 2• Nincs már erre eszköz? (JavaDoc?)• Dehogynem: (JavaDoc J)
– Az annotációk először itt jelentek meg
![Page 93: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/93.jpg)
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”?
![Page 94: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/94.jpg)
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
![Page 95: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/95.jpg)
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
![Page 96: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/96.jpg)
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
Fontos!
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.
![Page 97: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/97.jpg)
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]"; }
![Page 98: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/98.jpg)
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]"; }
Minden metódus a címke egy-egy elemét jelöli.
Nem szabad paramétereket használni, illetve throws klózt.
Lehetséges visszatérési értékek:primitívek, String, Class, enumerációk, annotációk, és ezek tömbjei.
![Page 99: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/99.jpg)
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 elementspublic class TimeTravel{ ... }// annotation with a single elementpublic @interface Copyright { String value(); // should be named value}@Copyright("2002 Yoyodyne Propulsion Systems")public class OscillationOverthruster { ... }
![Page 100: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/100.jpg)
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 { }
![Page 101: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/101.jpg)
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 { }
Jelzi, hogy ezt az annotációt meg kell tartani futási időben is, hogy reflektíven ki tudjuk olvasni.
![Page 102: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/102.jpg)
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 { }
Jelzi, hogy ezt az annotációt meg kell tartani futási időben is, hogy reflektíven ki tudjuk olvasni.
Jelzi, hogy ezt az annotációt csak metódusok címkézésére használhatjuk.
![Page 103: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/103.jpg)
Annotációk 6
• Teszt keretrendszerimport 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()); }}}}}
![Page 104: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/104.jpg)
Annotációk 6
• Teszt keretrendszerimport 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()); }}}}}
Végigmegyünk a tesztosztályból példányosított objektum metódusain, reflexióval.
![Page 105: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/105.jpg)
Annotációk 6
• Teszt keretrendszerimport 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()); }}}}}
Végigmegyünk a tesztosztályból példányosított objektum metódusain, reflexióval.
Ha @Test címkével jelzett metódust találunk, meghívjuk.
![Page 106: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/106.jpg)
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).
![Page 107: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/107.jpg)
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
![Page 108: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/108.jpg)
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)
![Page 109: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/109.jpg)
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ó)
![Page 110: Java 5 - inf.mit.bme.hu · PDF file• Java 5 újdonságai – Generikus nyelvi eszközök ... • Ős: generikus (meta)programozás, C++ template – Java: szűkített részhalmaz](https://reader034.vdocuments.net/reader034/viewer/2022052419/5a78be647f8b9aa17b8be5d9/html5/thumbnails/110.jpg)
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 VM-
einkben futó Java alkalmazásokat• …