Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
statnice:bakalar:b0b36pjv [2025/05/31 22:03] – zapleka3 | statnice:bakalar:b0b36pjv [2025/06/01 10:19] (current) – [Synchronized, Volatile, Join] zapleka3 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ==== Programování v jazyce JAVA: vlastnosti a koncepce jazyka. Principy objektového programování. ==== | + | ====== Programování v jazyce JAVA: vlastnosti a koncepce jazyka. Principy objektového programování. |
[[https:// | [[https:// | ||
Line 224: | Line 224: | ||
- | ===== 3. Výčtové typy ===== | + | ===== 3. Výčtové |
- | Výčtový typ / enumerate, | + | |
+ | ==== Výčtové typy (enum) ==== | ||
+ | |||
+ | Výčtový typ (angl. enumeration) | ||
+ | Zvyšuje čitelnost a typovou bezpečnost programu – místo čísel | ||
Například: | Například: | ||
Line 241: | Line 245: | ||
Day today = Day.MONDAY; | Day today = Day.MONDAY; | ||
+ | ``` | ||
+ | </ | ||
+ | Výčtové typy jsou ve skutečnosti speciální typ třídy – lze do nich přidat: | ||
+ | - konstruktor, | ||
+ | - metody, | ||
+ | - pole. | ||
+ | |||
+ | < | ||
+ | ```java | ||
public enum Suit { | public enum Suit { | ||
CLUBS(Color.BLACK), | CLUBS(Color.BLACK), | ||
Line 265: | Line 278: | ||
</ | </ | ||
- | ===== 4. Vnitřní a anonymní třídy ===== | + | ==== Kolekce (Java Collection Framework) ==== |
- | Třída která je definovaná uvnitř jiné třídy. | + | |
+ | Java Collections Framework (JCF) je sada rozhraní a tříd pro práci s obecnými datovými strukturami. | ||
+ | |||
+ | Základní vlastnosti: | ||
+ | * umožňují efektivní ukládání, | ||
+ | * hierarchicky uspořádané – Collection, List, Set, Map, Queue atd. | ||
+ | |||
+ | Základní typy kolekcí: | ||
+ | * List – uspořádaná kolekce s indexy (ArrayList, LinkedList) | ||
+ | * Set – množina bez duplicit (HashSet, TreeSet) | ||
+ | * Map – páry klíč–hodnota (HashMap, TreeMap) | ||
+ | * Queue – fronta (LinkedList, | ||
+ | |||
+ | Příklad: | ||
+ | < | ||
+ | ```java | ||
+ | List< | ||
+ | names.add(" | ||
+ | names.add(" | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | ==== Iterátor ==== | ||
+ | |||
+ | Iterátor je objekt, který umožňuje bezpečně procházet kolekce bez znalosti jejich vnitřní struktury. | ||
+ | |||
+ | Použití: | ||
+ | < | ||
+ | ```java | ||
+ | Iterator< | ||
+ | while (it.hasNext()) { | ||
+ | System.out.println(it.next()); | ||
+ | } | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | Zkrácený zápis pomocí for-each: | ||
+ | < | ||
+ | ```java | ||
+ | for (String name : names) { | ||
+ | System.out.println(name); | ||
+ | } | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | Rozhraní Iterable umožňuje použít kolekci ve for-each smyčce. | ||
+ | |||
+ | Poznámka: Kolekce nelze bezpečně měnit během iterace jinak než metodou it.remove(). | ||
+ | Jinak hrozí ConcurrentModificationException. | ||
+ | |||
+ | ==== Generické typy ==== | ||
+ | |||
+ | Generické typy (generika) umožňují psát obecný, opakovatelný a typově bezpečný kód, který lze aplikovat na různé datové typy bez nutnosti přetypování. | ||
+ | |||
+ | Deklarace: | ||
+ | < | ||
+ | ```java | ||
+ | List< | ||
+ | numbers.add(10); | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | Výhody generik: | ||
+ | - typová bezpečnost, | ||
+ | - žádné přetypování, | ||
+ | - opakovatelnost kódu. | ||
+ | |||
+ | Generická metoda: | ||
+ | < | ||
+ | ```java | ||
+ | public static <T> void printAll(List< | ||
+ | for (T item : list) { | ||
+ | System.out.println(item); | ||
+ | } | ||
+ | } | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | Poznámka: Generika jsou v Javě implementována pomocí type erasure – typová informace se za běhu ztrácí (např. nelze napsat new T()). | ||
+ | |||
+ | |||
+ | ===== 4. Vnitřní a anonymní třídy, Imutabilita, | ||
+ | |||
+ | ==== Vnitřní třídy ==== | ||
+ | Vnitřní třída | ||
+ | |||
+ | Je-li vnitřní třída označena jako static, jedná se o statickou vnitřní třídu, která nemá přístup k instanci vnější třídy. | ||
+ | |||
+ | Výhodou je lepší zapouzdření a přehlednost kódu – vnitřní třídy se používají tam, kde nemá smysl jejich existence samostatně. | ||
< | < | ||
```java | ```java | ||
Line 278: | Line 380: | ||
``` | ``` | ||
</ | </ | ||
+ | |||
+ | |||
+ | ==== Anonymní třídy ==== | ||
+ | Anonymní vnitřní třída je bezejmenná třída, která je definována a zároveň instanciována na místě. Používá se tam, kde potřebujeme jednorázově implementovat nějaké rozhraní nebo rozšířit třídu. | ||
+ | |||
+ | Typicky se využívá např. pro callbacky nebo posluchače událostí. | ||
Anonymní třída je třída vnitřní bez názvu, pro kterou je vytvořen pouze jediný objekt. | Anonymní třída je třída vnitřní bez názvu, pro kterou je vytvořen pouze jediný objekt. | ||
Line 312: | Line 420: | ||
``` | ``` | ||
</ | </ | ||
+ | |||
+ | ==== Imutabilita ==== | ||
+ | Imutabilní objekt je takový objekt, jehož stav po vytvoření již nelze změnit. To znamená: | ||
+ | * všechny atributy jsou private a final, | ||
+ | * objekt neposkytuje žádné metody, které by umožnily změnu stavu, | ||
+ | * objekt nevrací reference na své vnitřní proměnné. | ||
+ | |||
+ | Výhody: | ||
+ | * bezpečnost při vícevláknovém přístupu, | ||
+ | * snazší ladění a testování. | ||
+ | |||
+ | ==== Vzor Singleton ==== | ||
+ | Singleton je návrhový vzor, který zajišťuje, | ||
+ | * soukromým (private) konstruktorem, | ||
+ | * statickou proměnnou pro instanci třídy, | ||
+ | * veřejnou statickou metodou pro přístup k instanci. | ||
+ | |||
+ | < | ||
+ | ```java | ||
+ | public class Singleton { | ||
+ | private static final Singleton instance = new Singleton(); | ||
+ | |||
+ | private Singleton() {} | ||
+ | |||
+ | public static Singleton getInstance() { | ||
+ | return instance; | ||
+ | } | ||
+ | } | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | ==== Proměnné a metody třídy vs. instance ==== | ||
+ | |||
+ | * Instanční proměnné – náleží konkrétní instanci třídy, každá instance může mít jiné hodnoty. | ||
+ | * Třídní proměnné (statické) – sdílené všemi instancemi, existují nezávisle na instanci. | ||
+ | |||
+ | * Instanční metody – pracují s instančními daty, volají se na konkrétních objektech. | ||
+ | * Statické metody – patří třídě, volají se bez instance, nemají přístup k nestatickým členům. | ||
+ | |||
===== 5. Mechanismus výjimek ===== | ===== 5. Mechanismus výjimek ===== | ||
- | Výjimka (// | + | Výjimka (// |
- | Typickým příkladem | + | Výjimky se typicky používají pro chybové stavy, jako je dělení nulou nebo přístup mimo rozsah pole. |
- | ==== Hierarchie ==== | + | ==== Hierarchie |
- | * Vše začíná | + | * Všechny výjimky jsou potomky |
- | * **'' | + | * `Error` – závažné chyby JVM (např. |
- | * **'' | + | * `Exception` – výjimky, které lze (a měly by se) ošetřit. |
+ | * `RuntimeException` – běhové výjimky (např. `NullPointerException`, | ||
- | ==== Checked | + | ==== Checked |
* **Checked** – kompilátor hlídá; musíš je buď zachytit pomocí '' | * **Checked** – kompilátor hlídá; musíš je buď zachytit pomocí '' | ||
* **Unchecked** – všechny výjimky odvozené od '' | * **Unchecked** – všechny výjimky odvozené od '' | ||
- | ==== Ošetření | + | ==== Ošetření |
+ | |||
+ | Výjimky se ošetřují pomocí konstrukcí `try-catch-finally`. | ||
<code java> | <code java> | ||
try { | try { | ||
// rizikový kód | // rizikový kód | ||
} catch (IOException | SQLException ex) { // multi-catch od Java 7 | } catch (IOException | SQLException ex) { // multi-catch od Java 7 | ||
+ | e.printStackTrace(); | ||
log(ex); | log(ex); | ||
throw ex; // volitelné předání dál | throw ex; // volitelné předání dál | ||
Line 339: | Line 491: | ||
</ | </ | ||
- | * **try-with-resources** (Java 7+) – vše, co implementuje '' | + | * `catch` může být více, podle typu výjimky. |
+ | | ||
+ | |||
+ | ==== Try-with-resources | ||
+ | Od Javy 7 existuje `try-with-resources`, který automaticky | ||
<code java> | <code java> | ||
try (BufferedReader br = Files.newBufferedReader(Path.of(" | try (BufferedReader br = Files.newBufferedReader(Path.of(" | ||
Line 347: | Line 504: | ||
==== Vlastní výjimky ==== | ==== Vlastní výjimky ==== | ||
+ | Vlastní výjimky se vytvářejí děděním ze třídy `Exception` nebo `RuntimeException`. | ||
+ | |||
<code java> | <code java> | ||
- | public class DataFormatException | + | public class MyException |
- | public | + | public |
- | public | + | public |
- | public | + | public |
- | | + | |
} | } | ||
} | } | ||
Line 359: | Line 517: | ||
* **Kdy se hodí?** Když stávající výjimky nedostačují a potřebuješ popsat specifickou situaci. | * **Kdy se hodí?** Když stávající výjimky nedostačují a potřebuješ popsat specifickou situaci. | ||
* Rozhodni se, zda má být **checked** (nutí volající k ošetření) nebo **unchecked** (dědí z '' | * Rozhodni se, zda má být **checked** (nutí volající k ošetření) nebo **unchecked** (dědí z '' | ||
+ | |||
+ | * Pokud dědíme z `Exception`, | ||
+ | * Pokud dědíme z `RuntimeException`, | ||
==== Best practices ==== | ==== Best practices ==== | ||
- | * Vyhazuj | + | * Zachytávej |
- | * Nezachytávej zbytečně | + | * Nepoužívej prázdné `catch` bloky – vždy loguj nebo informuj uživatele. |
- | * Vždy uvolňuj prostředky | + | * Uvolňuj prostředky |
- | * Přidávej | + | * Přidávej |
+ | | ||
+ | |||
+ | ==== Shrnutí podle typu výjimky ==== | ||
+ | * `Throwable` – kořenová třída, zachytitelná, | ||
+ | * `Exception` – standardní ošetřitelné výjimky. | ||
+ | * `IOException`, | ||
+ | * `RuntimeException`, | ||
+ | * `Error` – závažné chyby – většinou se nezachytávají (`OutOfMemoryError`, | ||
===== Práce se soubory (java.io) ===== | ===== Práce se soubory (java.io) ===== | ||
+ | |||
+ | Soubor je množina údajů uložená ve vnější paměti. Přístup k němu probíhá pomocí proudů (streamů), které umožňují čtení a zápis dat sekvenčně nebo náhodně. Dělíme je podle typu dat na textové a binární. | ||
==== Klíčové třídy ==== | ==== Klíčové třídy ==== | ||
- | * **'' | + | * **File** – reprezentuje cestu k souboru nebo adresáři. Lze ověřit |
- | * **'' | + | * **InputStream / OutputStream** – bajtové proudy (pro binární data). |
- | * Dekorátory: | + | * Dekorátory: |
- | * **'' | + | * **Reader / Writer** – znakové proudy (pro textová data). |
- | * Typicky '' | + | * Často používané: |
- | * **'' | + | * **RandomAccessFile** – umožňuje |
- | | + | * Rozhraní: Closeable, Flushable, Serializable – sjednocují |
- | ==== Vytvoření | + | ==== Otevření |
<code java> | <code java> | ||
try (InputStream | try (InputStream | ||
Line 390: | Line 561: | ||
</ | </ | ||
- | ==== Otevření | + | ==== Otevření |
Nejčastější (a dodnes plně dostačující) kombinací je dvojice **``FileReader`` + ``BufferedReader``**: | Nejčastější (a dodnes plně dostačující) kombinací je dvojice **``FileReader`` + ``BufferedReader``**: | ||
Line 405: | Line 576: | ||
</ | </ | ||
- | * **``FileReader``** čte **znaky** (automaticky použije defaultní kódování platformy, nebo explicitně zadej např. ``StandardCharsets.UTF_8``). | + | * **``FileReader``** čte **znaky** (automaticky použije defaultní kódování platformy, nebo explicitně zadej např. ``StandardCharsets.UTF_8``). |
- | * **``BufferedReader``** obalí čtení do větších bloků → méně systémových volání, vyšší výkon. | + | * **``BufferedReader``** obalí čtení do větších bloků → méně systémových volání, vyšší výkon. |
- | * Konstrukce **try-with-resources** (Java 7+) zavře reader i v případě výjimky. | + | * Konstrukce **try-with-resources** (Java 7+) zavře reader i v případě výjimky. |
- | ==== Textové vs. binární ==== | + | ==== Textové vs. binární |
- | * **Text** → '' | + | * **Textové** – čitelné pro člověka, pracujeme se znaky pomocí |
- | * **Binární** | + | * **Binární** |
==== Serializace objektů ==== | ==== Serializace objektů ==== | ||
Line 421: | Line 592: | ||
</ | </ | ||
* Třída musí implementovat '' | * Třída musí implementovat '' | ||
- | * Pozor na kompatibilitu verzí tříd (pole '' | + | * Lze uložit i více objektů. |
+ | |||
+ | ==== Přístup k datům ==== | ||
+ | * **Sekvenční** – čtení/ | ||
+ | * **Náhodný (Random Access)** – přímý přístup k určitému místu v souboru (RandomAccessFile). | ||
+ | |||
+ | ==== Cesty k souborům ==== | ||
+ | * **Absolutní** – začíná kořenem systému (např. / | ||
+ | * **Relativní** – relativní k pracovnímu adresáři aplikace. | ||
==== Best practices ==== | ==== Best practices ==== | ||
- | * Vždy používej | + | * Vždy používej try-with-resources |
- | * Bufruj | + | |
- | * Nezachytávej holou '' | + | * Bufruj |
- | * Při sériové práci se soubory preferuj nové NIO API ('' | + | * Nezachytávej holou '' |
+ | * Při sériové práci se soubory preferuj nové NIO API ('' | ||
===== Sokety ===== | ===== Sokety ===== | ||
+ | |||
+ | Soket je objekt, který propojuje aplikaci se síťovým protokolem. Umožňuje síťovou komunikaci mezi dvěma koncovými body (např. klientem a serverem) prostřednictvím definovaných API. V Javě se sokety používají pro komunikaci přes protokoly TCP a UDP. | ||
==== Typy soketů a API ==== | ==== Typy soketů a API ==== | ||
- | | Třída | + | |
- | | '' | + | | Třída |
- | | '' | + | |-------------------------|------------------|--------------------------|-------------------------------| |
- | | '' | + | | Socket / ServerSocket |
+ | | DatagramSocket | ||
+ | | MulticastSocket | ||
==== TCP vs. UDP – typy spojení ==== | ==== TCP vs. UDP – typy spojení ==== | ||
- | * **TCP** – potvrzuje | + | |
- | | + | **TCP (Transmission Control Protocol)** |
+ | * Spojovaný protokol | ||
+ | * Zaručuje | ||
+ | * Pomalejší, ale spolehlivý | ||
+ | |||
+ | **UDP (User Datagram Protocol)** | ||
+ | * Nespojovaný protokol | ||
+ | * Rychlý, nízká latence, žádné záruky | ||
+ | * Nutno si případně | ||
==== Ukázkový TCP server/ | ==== Ukázkový TCP server/ | ||
Line 465: | Line 657: | ||
} | } | ||
</ | </ | ||
+ | |||
+ | ==== Primitiva soketu ==== | ||
+ | |||
+ | * **create** – vytvoření nového soketu | ||
+ | * **bind** – přiřazení lokální adresy a portu | ||
+ | * **connect** – navázání spojení (klient) | ||
+ | * **listen** – čekání na spojení (server) | ||
+ | * **accept** – přijetí spojení | ||
+ | * **send / receive** – odeslání a příjem dat | ||
+ | * **shutdown / close** – uzavření spojení | ||
==== Best practices ==== | ==== Best practices ==== | ||
Line 472: | Line 674: | ||
* Pro šifrovaný přenos sáhni po '' | * Pro šifrovaný přenos sáhni po '' | ||
* Vždy uzavírej soket v '' | * Vždy uzavírej soket v '' | ||
- | |||
===== 6. Paralelismus ===== | ===== 6. Paralelismus ===== | ||
+ | |||
+ | Paralelismus umožňuje efektivnější využití systémových prostředků (více jader CPU, paralelní zpracování vstupů, vyšší výkon, reakce na události). V Javě se používá vícevláknové programování pomocí třídy `Thread`, rozhraní `Runnable`, případně thread poolu (`ExecutorService`). | ||
+ | |||
Nutné dodržet pravidla synchronizace, | Nutné dodržet pravidla synchronizace, | ||
+ | |||
+ | ==== Vytváření a spouštění vláken ==== | ||
+ | |||
+ | Vlákno lze vytvořit buď děděním od třídy `Thread`, nebo implementací rozhraní `Runnable`: | ||
< | < | ||
Line 534: | Line 742: | ||
``` | ``` | ||
</ | </ | ||
+ | |||
+ | ==== Synchronizace a problémy souběhu ==== | ||
+ | |||
+ | Při práci s více vlákny vznikají typické problémy: | ||
+ | * Race condition – více vláken přistupuje ke sdíleným datům bez koordinace. Výsledek je nedefinovaný. | ||
+ | * Řešení: synchronized bloky, volatile proměnné | ||
+ | * Deadlock – dvě nebo více vláken čekají na zdroje, které drží jiná vlákna. | ||
+ | * Řešení: správné pořadí zamykání, timeouty, algoritmy prevence deadlocku | ||
+ | * Producer/ | ||
+ | * Řešení: wait(), notify(), fronty z balíku java.util.concurrent | ||
+ | * Reader/ | ||
+ | * Řešení: ReadWriteLock nebo rozdělení na operace pouze pro čtení a zápis | ||
+ | |||
+ | ==== Synchronized, | ||
+ | |||
+ | * synchronized – zajišťuje, | ||
+ | * volatile – proměnná může být měněna z více vláken, JVM nezachová její hodnotu v cache (když se změní na false - informuje to ostatní vlákna, ale ne jako counter) | ||
+ | * join() – čeká na dokončení jiného vlákna | ||
+ | * wait() / notify() – vlákna čekají a signalizují si mezi sebou (pouze uvnitř synchronized bloku) | ||
+ | |||
+ | ==== Thread Pool (Executor) ==== | ||
+ | |||
+ | Používá se místo ručního vytváření velkého počtu vláken. Efektivnější správa a recyklace. | ||
+ | |||
+ | < | ||
+ | ```java | ||
+ | ExecutorService executor = Executors.newFixedThreadPool(4); | ||
+ | executor.submit(new WorkerRunnable(1, | ||
+ | executor.shutdown(); | ||
+ | ``` | ||
+ | </ | ||
+ | |||
+ | * ExecutorService – spravuje vláknový pool | ||
+ | * submit() – spustí úkol | ||
+ | * shutdown() – ukončí Executor | ||
+ | * Future – objekt s výsledkem nebo stavem asynchronního výpočtu | ||
+ | |||
+ | ==== Kdy použít paralelismus ==== | ||
+ | |||
+ | * Více úloh může běžet souběžně – více jádrový procesor | ||
+ | * Aplikace provádí dlouhé IO operace, ale musí zůstat responzivní (např. GUI) | ||
+ | * Kontrola nebo úkoly na pozadí (např. notifikace, synchronizace) | ||
+ |