Pokročilé programování na platformě JAVA, letní semestr 2012
Transkript
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
inicializátory mohou "vyhazovat" pouze výjimky, které
jsou definovány v konstruktorech
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, ...
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ý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;
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ý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...
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...
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...
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í ...