Pokročilé programování na platformě JAVA, letní semestr 2012

Transkript

Pokročilé programování na platformě JAVA, letní semestr 2012
Pokročilé programování na
platformě Java
Úvod
Java, letní semestr 2012
22.2.2012
O předmětu
●
Petr Hnětynka
–
[email protected]
●
http://d3s.mff.cuni.cz/teaching/vsjava/
●
pokračování "Javy (NPRG013)"
–
●
předpokládá se základní znalost Javy (v rozsahu
NPRG013)
0/2 Z
Java, letní semestr 2012
22.2.2012
Zápočet
●
napsání zápočtového programu
–
domluvit si zadání do pátku 11. května 2012
●
●
●
–
poslat mailem
přiměřeně složité téma
netriviálním způsobem využívat některou z technologií
probíraných v předmětu
odevzdat nejlépe do konce června
●
●
nejpozději do září – pátek 28. září 2012 12:00 (poledne)
odevzdání buď emailem nebo osobně (pokud to bude
nutné)
Java, letní semestr 2012
22.2.2012
Osnova předmětu
●
hlubší pohled do jazyka Java
–
–
–
–
–
●
●
●
●
●
●
přehled a historie platformy Java
tipy a triky s Java type systém
reflection API
Java 5 - generické typy, anotace,...
class loaders, security
distribuované technologie: RMI,...
komponentový model JavaBeans
JEE: EJB, Servlets, JSP
JME: CLDC, MIDP, JavaCard
další technologie založené na platformě Java: Java
APIs for XML, JDBC, JMX,...
Android
Java, letní semestr 2012
22.2.2012
Literatura, odkazy
●
vše o Javě
–
●
Java tutorial
–
●
http://download.oracle.com/javase/tutorial/index.html
(http://java.sun.com/docs/books/tutorial/index.html)
Java Language Specification
–
●
http://www.oracle.com/technetwork/java/
(http://java.sun.com/)
http://java.sun.com/docs/books/jls/
Thinking in Java
–
http://www.mindview.net/Books/TIJ/
Java, letní semestr 2012
22.2.2012
Java
Základní přehled, historie,...
Java, letní semestr 2012
22.2.2012
Java
●
objektově orientovaný
–
vše (téměř) je objekt
●
●
interpretovaný
–
–
●
výjimka – primitivní typy
zdrojový kód (.java) – překlad do tzv. bytecode
bytecode (.class) – interpretován v tzv. virtual machine
nezávislý na architektuře
–
programy běží ve virtual machine
Java, letní semestr 2012
22.2.2012
Historie
●
●
JDK 1.0 – 1996
JDK 1.1 – 1997
–
●
Java 2 platform – 2000
–
●
JDK 1.2, 1.3 – změny pouze v knihovnách
JDK 1.4 – 2002
–
●
Vnitřní třídy
Assert
JDK 5.0 – 2004
–
změny v jazyce
●
●
●
●
●
generické typy (~ šablony)
anotace
...
JDK 6 – 2006
JDK 7 – 2011
„malé“ změny v jazyce
●
JDK 8 – 2013 ???
– „velké“
Java, letní semestr
2012 změny v jazyce
–
22.2.2012
Java platform
●
●
●
JSE – standard edition
JEE – enterprise edition
JME – micro edition
Java, letní semestr 2012
22.2.2012
"Výkon"
●
původně (~ JDK 1.1, 1998)
–
●
Java programy 6x pomalejší než C
nyní:
–
Just-In-Time (JIT) compilation
●
●
●
●
●
v rámci spuštění se program přeloží
provádí se nativní kód
pomalý start, pak rychlé
výkon ~ srovnatelný s normálními aplikacemi
velká "spotřeba" paměti
Java, letní semestr 2012
22.2.2012
Implementace Javy
●
Oracle (Sun Microsystems)
–
–
●
Blackdown (do 1.5)
–
–
●
open-source implementace JVM pro Linux
založená na kódu Sun JVM
IBM
–
●
"oficiální" implementace
Windows, Solaris, Linux
IBM JDK
Jikes
–
Jikes překladač
●
●
●
–
open-source
rychlý
striktní kompatibila s Javou
Jikes RVM
Java, letní semestr 2012
22.2.2012
Implementace Javy
●
Jikes RVM
–
–
–
–
Research Virtual Machine
open-source
pro testování různých rozšíření
napsáno v Javě
●
"self-hosting"
–
●
boot-image writer
–
●
Java program, spustí se pod existující JVM
boot-image loader
–
–
nepotřebuje k běhu jinou JVM
program v C++
nepodporuje celé Java API
Java, letní semestr 2012
22.2.2012
Implementace Javy
●
OpenJDK
–
–
–
–
http://openjdk.java.net/
open-source
podporováno Oracle (Sun Microsystems)
oficiální implementace z OpenJDK
Java, letní semestr 2012
22.2.2012
Další... (spíše už „historické“)
●
●
●
●
GNU classpath – implementace základních Java
knihoven
Guavac – překladač
Kaffe – virtual machine
Apache Harmony
–
●
open source Java SE
...
Java, letní semestr 2012
22.2.2012
JAVA
Typový systém, vlákna,...
Java, letní semestr 2012
22.2.2012
Typový systém
●
silně typovaný jazyk
–
–
●
●
třídy (class)
primitivní typy (int, boolean, char,...)
"vše" je v nějaké třídě
neexistují globální proměnné, funkce,...
–
obdoba jsou static metody a atributy
Java, letní semestr 2012
22.2.2012
Test
public class InitTest {
static int i = 1;
{ i+=2; };
static { i++; };
public static void main(String argv[]) {
System.out.println(i);
System.out.println(new InitTest().i);
};
};
Program vypíše:
a) 2 4
b) 1 3
c) 3 5
d) 4 4
e) nelze přeložit
Java, letní semestr 2012
22.2.2012
Řešení testu
●
správně je a) 2 4
●
{ ...... } v definici třídy
–
–
–
●
inicializátor
provádí se při vytváření nové instance
používá se pro inicializaci anonymních vnitřních tříd
static { ....... }
–
–
–
statický inicializátor
provádí se při "natažení" třídy do VM
může pracovat pouze se static prvky třídy
Java, letní semestr 2012
22.2.2012
Test 2
public class InitTest {
static int i = 1;
{ i+=2; };
public InitTest() {
System.out.println(i++);
}
static { i++; };
public static void main(String argv[]) {
System.out.println(i);
System.out.println(new InitTest().i);
};
};
Výsledek:
a) 1 3 5
b) 2 3 5
c) 2 4 5
Java, letní semestr 2012
22.2.2012
Řešení testu 2
●
správně je C) 2 4 5
●
inicializátor se provádí před konstruktorem
●
nejdříve se inicializuje předek
–
inicializátory a konstruktor
Java, letní semestr 2012
22.2.2012
Výjimky a inicializátory
●
inicializátory mohou "vyhazovat" pouze výjimky, které
jsou definovány v konstruktorech
–
●
musí být definován alespoň jeden konstruktor
inicializátory anonymních tříd mohou vyhazovat
jakékoliv výjimky
–
–
třída se vytváří pouze jednou
není problém výjimku odchytit / deklarovat
Java, letní semestr 2012
22.2.2012
Statické inicializátory
●
musí skončit normálně
–
●
●
jinak nelze přeložit
prováděny v pořadí podle výskytu ve zdrojovém
souboru
nemohou obsahovat return
–
nelze přeložit
Java, letní semestr 2012
22.2.2012
Pole
●
●
●
pole ~ objekt
proměnná ~ reference
do typu Object lze přiřadit jakoukoliv referenci
Object a1[] = new Object[10];
Object a2[] = new Object[5];
a1[0]=a2;
a2[0]=a1;
Java, letní semestr 2012
22.2.2012
Vlákna
●
Java Language Specification
–
definuje "memory model"
●
●
●
určuje možná chování programu
pro daný program a průběh výpočtu určí, zda průběh
výpočtu je legální
volatile atributy tříd
–
vždy v konzistentním stavu
●
vlákna můžou mít zkopírované atributy do svojí paměti
–
●
●
změny ne-volatile atributů nemusejí být ihned vidět z
jiných vláken
přiřazení (i čtení) do primitivních typů <= 32 bitů –
atomické
–
tj. long a double nejsou
●
●
důvod = rychlost
ale pokud jsou volatile, tak ano
přiřazení (čtení) referencí - atomické
Java, letní semestr 2012
22.2.2012
Vlákna
●
balík java.util.concurrent.atomic
–
třídy typu
●
●
●
●
–
AtomicInteger
AtomicIntegerArray
AtomicLong
…
poskytují
●
●
●
atomický přístup
metodu compareAndSet()
...
Java, letní semestr 2012
22.2.2012
Synchronizace
●
"monitor"
–
–
●
●
zámek a fronta čekajících vláken asociované s každou
instancí
zámek a fronta čekajících vláken asociované s každou
třídou
příkaz/modifikátor synchronized
příkaz
–
synchronized (Výraz) Blok
–
výraz se musí vyhodnotit na referenci na objekt
než se začne Blok vykonávat, vlákno musí získat pro
sebe zámek na objektu určeném pomocí Výrazu
po skončení Bloku se zámek uvolní
–
–
Java, letní semestr 2012
22.2.2012
Synchronizace
●
modifikátor metody
–
–
–
–
–
●
●
synchronized v hlavičce metody
chová se stejně jako příkaz synchronized
vlákno než začne vykonávat metodu musí získat
zámek na objektu
po skončení metodu se zámek uvolní
static synchronized metody – získává se zámek
asociovaný se třídou
vzájemně vyloučeny jsou jen synchronized metody a
bloky
nějaké vlákno má zámek na objektu – ostatní vlákna
mohou používat atributy objektu i volat
ne-synchronized metody
Java, letní semestr 2012
22.2.2012
wait & notify
●
wait, notify, notifyAll
–
●
definovány na java.lang.Object
void wait()
–
lze volat jen pokud volající vlákno drží zámek na
daném objektu (tj. v synchronized sekci)
●
–
–
jinak výjimka IllegalMonitorStateException
vloží vlákno do fronty čekajících vláken
uvolní zámek na objektu
●
jiná vlakna mohou získat zámek, tj. začít provádět
synchronized blok
Java, letní semestr 2012
22.2.2012
wait & notify
●
●
po wait je vlákno ve frontě čekajících vláken dokud
někdo nezavolá notify nebo notifyAll
void notify()
–
–
"probudí" jedno (nějaké) vlákno z fronty čekajících
(pokud není prázdná)
lze volat jen ze synchronized sekcí
●
–
●
jinak výjimka IllegalMonitorStateException
probuzené vlákno pokračuje ve výpočtu až získá
zámek (tj. vlákno, co drželo zámek (a zavolalo notify)
opustí synchonized sekci)
void notifyAll()
–
–
probudí všechna vlákna ve frontě
vlákna budou pokračovat, až získají zámek
Java, letní semestr 2012
22.2.2012
wait & notify
●
tři varianty wait
–
–
–
void wait()
void wait(int milis)
void wait(int milis, int nanos)
●
●
čekají ve frontě, dokud někdo neprobudí, maximálně
však zadanou dobu
čekání ve wait lze přerušit (metoda interrupt())
–
vyhodí InterruptedException
●
wait, notify i notifyAll jsou final
●
metoda sleep() neuvolňuje zámek
Java, letní semestr 2012
22.2.2012
Synchronizace
●
java.util.concurrent
–
–
–
–
–
semafory
zámky
synchronizované fronty
atomické operace
...
Java, letní semestr 2012
22.2.2012
Změny v jazyce od Java 5
●
●
●
●
●
●
●
static import
auto-boxing and auto-unboxing
nový for cyklus
generické typy
výčtový typ enum
metody s proměnným počtem parametrů (printf)
anotace (metadata)
Java, letní semestr 2012
22.2.2012
Java 7, 8
●
●
Java 6 – změny pouze v knihovnách
Java 7 – 2011
–
●
„mírné“ změny v jazyce
Java 8 – pravděpodobně léto 2013
–
–
„větší“ změny v jazyce
„Java 8 will be revolution, not evolution“
Mark Reinhold, konference JavaOne, říjen 2011
Java, letní semestr 2012
22.2.2012
Java 7
●
změny
–
–
–
–
–
–
změny v syntaxi
podpora dynamických jazyků (nová instrukce v
bytekódu)
změny v NIO
Nimbus (Swing LaF)
nová verze JDBC
...
Java, letní semestr 2012
22.2.2012
Java 7 – změny v syntaxi
●
zápis konstant
–
binární konstanty
●
–
oddělení řádu v konstantách pomocí podtržítek
●
●
0b010101
1_000_000
String v switch příkazu
String
...
switch
case
case
...
}
month;
(month) {
"January":
"February":
Java, letní semestr 2012
22.2.2012
Java 7 – změny v syntaxi
●
operátor <>
–
–
–
zjednodušená vytváření generických typů
typ u new se automaticky odvodí
př.
List<String> list = new ArrayList<>();
List<List<String>> list = new ArrayList<>();
List<List<List<String>>> list =
new ArrayList<>();
Map<String, Collection<String>> map =
new LinkedHashMap<>();
●
otázka
Proč není new bez <> ? Tj. např.
List<String> list = new ArrayList();
Java, letní semestr 2012
22.2.2012
Java 7 – změny v syntaxi
●
interface AutoClosable a rozšířený try
–
př:
class Foo implements AutoClosable {
...
public void close() { … }
}
try ( Foo f1 = new Foo(); Foo f2 = new Foo() ) {
...
} catch (…) {
...
} finaly {
...
}
–
při ukončení try (normálně nebo výjimkou) se vždy
zavolá close() na objekty z deklarace v try
●
volá se v opačném pořadí než deklarováno
Java, letní semestr 2012
22.2.2012
Java 7 – změny v syntaxi
●
rozšíření catch na více výjimek
–
●
př:
try {
...
} catch (Exception1 | Exception2 ex) {
...
}
lepší typová kontrola výjimek při re-throw
Java, letní semestr 2012
22.2.2012
Je tento kód správně
private void foo(int i) throws Ex1, Ex2 {
try {
if (i < 0) {
throw new Ex1();
} else {
throw new Ex1();
}
} catch (Exception ex) {
throw ex;
}
}
●
●
v Java 7 ano
v Java 6 ne
–
kompilátor vypíše chybu zde
Java, letní semestr 2012
22.2.2012
Co možná bude v 8
●
zjednodušená inicializace kolekcí
–
–
–
●
List<Integer> numbers1 = [ 1, 2, 3 ];
Set<Integer> numbers2 = { 1, 2, 3 };
Map<String, String> translations =
{
"one" : "jedna",
"two" : "dve",
"three" : "tri"
};
přístup k prvkům kolekcí přes hranaté závorky
–
–
numbers1[1]
translations["one"]
Java, letní semestr 2012
22.2.2012
Co možná bude v 8
●
Elvis operátory
–
?:
●
●
●
–
?.
●
●
–
?[]
●
binární operátor
pokud je levá strana null, vrátí se pravá, jinak levá
př: value = name ?: "NO-NAME"
funguje jako tečka, ale pouze pokud na levé straně není
null
př: person?.address?.toString();
funguje jako [ ], tj. přístup prvkům pole (kolekce), ale
pouze pokud není null
Java, letní semestr 2012
22.2.2012
Co možná bude v 8
●
Lambda types (Closures, anonymní metody)
●
současný kód
List<String> list = ...
Collections.sort(list, new Comparator<String>() {
public int compare(String str1, String str2) {
return str1.length() - str2.length();
}
});
●
s lambda types
List<String> list = ...
Collections.sort(list, #(String str1, String str2) {
return str1.length() - str2.length();
});
Java, letní semestr 2012
22.2.2012
Co možná bude v 8
●
Moduly
Java, letní semestr 2012
22.2.2012

Podobné dokumenty

Pokročilé programování na platformě JAVA, letní semestr 2016

Pokročilé programování na platformě JAVA, letní semestr 2016 inicializátory mohou "vyhazovat" pouze výjimky, které jsou definovány v konstruktorech

Více

JSP

JSP většina dnešních webových stránek je dynamická

Více

Java vlákna

Java vlákna jiná vlákna pokoušející se použít synchr. metodu uzamčeného objektu musí čekat ve frontě, tím se zamezí interferenci vláken způsobující nekonzistentnosti paměti. Když proces opustí synchr. metodu, ...

Více

Fronty (Queue) v JDK 1.5 (1.6)

Fronty (Queue) v JDK 1.5 (1.6) dlouho bude daná položka dostupná pro přidání do fronty poll(long timeout, TimeUnit unit ) – nastavení časového intervalu, za jak dlouho bude daná položka dostupná pro odebrání z fronty add(E e) – ...

Více

Vývoj programovacích jazyků

Vývoj programovacích jazyků public int getValue() { return value; } public int nsd ( int v ) { int z = value; int y = v; while ( y != 0 ) { int t = y; y = z % y; z = t;

Více

Proprietární licence

Proprietární licence automaticky vybaví proprietární software, ale i svobodný software může být komerční (viz např. placené Linuxové distribuce). Jiným příkladem je freeware – tyto programy jsou šířeny zadarmo, nemají ...

Více

Vývoj programovacích jazyků

Vývoj programovacích jazyků { public static void main (String args[]) { System.out.println(" vstup dvou celych cisel:"); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { IntWithNsd x = new IntWi...

Více

Srovnání PHP s ASP.NET

Srovnání PHP s ASP.NET Náplní práce je komplexní srovnání dvou rozšířených technologií pro vývoj webových aplikací, skriptovacího PHP 5 s objektovým ASP.NET 1.1. Cílem textu je podat dostatečné podkladové informace pro v...

Více

10. Přílohy

10. Přílohy java – příkaz ke spouštění aplikací, má dvě základní syntaxe: java [volby] jméno_třídy [parametry] java [volby] –jar archiv.jar [parametry] V první variantě je parametrem jméno třídy – tato třída m...

Více

dp. - khaki Butterfly

dp. - khaki Butterfly stránkách firmy Macromedia http://www.macromedia.com/. Existují dvě základní verze pro různé druhy prohlížečů. První z uvedených URL automaticky zjistí typ vašeho prohlížeče a nabídne odpovídající ...

Více