JAVA. Odbočka: Návrhové vzory (Design patterns)

Podobné dokumenty
JAVA. Odbočka: Návrhové vzory (Design patterns)

JAVA. HTTP API (klient)

GUI. Systémová integrace pro desktopové aplikace

JAVA V Serializace Java, zimní semestr

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Regulární výrazy. Vzory

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Iterator & for cyklus

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java a XML. 10/26/09 1/7 Java a XML

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java Výjimky Java, zimní semestr

Logování zaznamenávání informací o průběhu programu, ladících a chybových informací

Java Enum Java, zimní semestr ,2017 1

Logování. Log4J. Základní pojmy používané v log4j

Seminář Java IV p.1/38

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

20. Projekt Domácí mediotéka

Úvod do programovacích jazyků (Java)

UJO Framework. revoluční architektura beans. verze

PREPROCESOR POKRAČOVÁNÍ

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Teoretické minimum z PJV

typová konverze typová inference

Vytváření a použití knihoven tříd

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

JAVA Unit testing Java, zimní semestr

Programování v jazyku Java Dokumentace, logování, regex

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Návrhové vzory OMO, LS 2014/2015

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Projekty pro výuku programování v jazyce Java

KTE / ZPE Informační technologie

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Programování v Javě I. Únor 2009

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Abstraktní datové typy: zásobník

Principy objektově orientovaného programování

Java Řetězce Java, zimní semestr

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Vláknové programování část V

Typický prvek kolekce pro české řazení

Programování v Javě I. Leden 2008

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektově orientované programování

Dědičnost (inheritance)

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Algoritmizace a programování

Programátorská příručka

Výčtový typ strana 67

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Podmínky na zápočet. Java, zimní semestr

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Chain of responsibility

Java - řazení objektů

Generické programování

Programovací jazyk Java

JAVA. Krátce o Reflection API

Abstraktní třída a rozhraní

1. Dědičnost a polymorfismus

Návrhové vzory Design Patterns

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

, Brno Připravil: David Procházka Návrhové vzory

NetBeans platforma. Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2009 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 25

JAVA. Další jazyky kompilovatelné do Java byte-code

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

JAVA JavaBeans Java, letní semestr

RMI Remote Method Invocation

Programování v C++ 3, 3. cvičení

PŘETĚŽOVÁNÍ OPERÁTORŮ

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Jazyk C# (seminář 3)

Semin aˇr Java N avrhov e vzory Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Duben 2008 Radek Koˇc ı Semin aˇr Java N avrhov e vzory 1/ 24

1. Téma 12 - Textové soubory a výjimky

Komponenty v.net. Obsah přednášky

IRAE 07/08 Přednáška č. 1

Programování v C++ 1, 6. cvičení

Úvod do programovacích jazyků (Java)

Kód, který se nebude často měnit

Zápis programu v jazyce C#

Čipové karty Lekařská informatika

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Struktura třídy, operátory, jednoduché algoritmy, junit. Programování II 2. cvičení Alena Buchalcevová

Z. Kotala, P. Toman: Java ( Obsah )

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

IRAE 07/08 Přednáška č. 7. Začátek (head)

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstract Factory úvod

Transkript:

JAVA Odbočka: Návrhové vzory (Design patterns) 1

Návrhové vzory obecné řešení problému, které se využívá při návrhu počítačových programů (Wikipedia) Gamma, E., Helm, R., Johnson, R., Vlissides, J. (1995). Design Patterns: Elements of Reusable Object-Oriented Software různé druhy tvorba objektů (creational) struktura (structural) chování (behavioral)... 2

Singleton pattern jedináček pouze jedna instance od dané třídy public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() { } public static Singleton getinstance() { return INSTANCE; } } 3

Singleton pattern jiná implementace public enum Singleton{ INSTANCE; private EnumSingleton() { } } použití java.lang.runtime... 4

Factory pattern vytváření nových objektů (statická) metoda vytvářející nové objekty polymorfismus při vytváření objekt výhody skrytí vytváření plná kontrola nad typem a počtem instancí příklady static Integer valueof(int i) static <E> List<E> of(e... elements) 5

Factory pattern (příklad) public class Complex { public double real; public double imaginary; public static Complex fromcartesian(double real, double imaginary) { return new Complex(real, imaginary); } public static Complex frompolar(double modulus, double angle) { return new Complex(modulus * Math.cos(angle), modulus * Math.sin(angle)); } } private Complex(double real, double imaginary) { this.real = real; this.imaginary = imaginary; } 6

Factory pattern (příklad) public static ImageReader createimagereader(imageinputstreamprocessor iisp) { if (iisp.isgif()) { return new GifReader(iisp.getInputStream()); } else if (iisp.isjpeg()) { return new JpegReader(iisp.getInputStream()); } else { throw new IllegalArgumentException("Unknown image type."); } } 7

Factory pattern nevýhoda nelze vytvářet potomky (privátní konstruktor) lze obejít protected konstruktorem nebezpečné lze ignorovat factory metodu 8

JAVA java.util.logging 9

Přehled API pro vytváření logů aplikace používá Logger metody log() Logger vytváří LogRecord a předává ho Handleru Handler zajišťuje vypisování logů na obrazovku, do souboru,... Filter filtrování logovaných zpráv Formatter formátování zpráv LogManager přímo se (obvykle) nepoužívá jeden globální objekt, spravuje loggery 10

Logger hierarchická struktura - strom logger posílá zprávy i do předka názvy loggerů by měly kopírovat hierarchii tříd několik úrovní zpráv java.util.logging.level SEVER WARNING INFO CONFIG FINE FINER FINEST lze určit, od které úrovně výše se budou zprávy logovat (nižší se budou zahazovat) 11

Handler několik předdefinovaných handlerů Handler abstraktní třída, ostatní od ní dědí StreamHandler do OutputStream ConsoleHandler do System.err FileHandler do souboru jeden nebo "rotování" souboru SocketHander po síti MemoryHadler do bufferu vlastní handler podědit od Handler 12

Formatter SimpleFormatter text "human-readable" XMLFormatter xml 13

Logování metody na Logger podle levelu sever(string msg) warning(string msg)... obecné log(level l, String msg) log(level l, String msg, Object o) log(level l, String msg, Throwable t) odkud logováno logp(level l, String sourceclass, String sourcemethod, String msg) líné logování void log(level level, Supplier<String> msgsupplier) void severe(supplier<string> msgsupplier)... 14

Příklad static Logger logger = Logger.getLogger("cz.cuni.mff.java.logging.TestLog");... logger.info("doing stuff"); try{... } catch (Throwable ex){ logger.log(level.warning, "exception occured",ex); } logger.info("done"); 15

Externí konfigurace pomocí properties java.util.logging.config.file obvyklá struktura pro properties (jmeno=hodnota) <logger>.hadlers = seznam handlerů pro daný logger <logger>.level = level pro daný logger... bez úvodního jména kořenový logger java.util.logging.config.class třída zodpovědná za načítání konfigurace předchozí property pak nemusí mít žádný význam 16

System.Logger mnoho různých (externínch) logovacích knihoven Log4J, SLF4J... System.Logger System.getLogger(String name) od Java 9 vrátí logger záleží na nastavení, jaký se použije System.Logger void log(system.logger.level level, String msg) void log(system.logger.level level, Supplier<String> msgsupplier)... 17

java.util Čas, datum 18

java.util.date reprezentace času s přesností na milisekundy od 1.1.1970 většina metod je deprecated od JDK1.1 nahrazeny třídou Calendar konstruktory Date() instance bude reprezentovat čas ve chvíli vytvoření objektu Data(long date) instance bude reprezentovat daný čas metody v podstatě jen na porovnávání boolean after(date d) boolean before(date d) int compareto(date d) ostatní metody jsou deprecated 19

java.util.calendar abstraktní třída jediný ne-abstract potomek GregorianCalendar statické atributy co lze zjišťovat a nastavovat YEAR, MONTH, DAY_OF_WEEK, DAY_OF_MONTH, HOUR, MINUTE, SECOND, AM_PM,... pro měsíce JANUARY, FEBRUARY,... pro dny v týdnu SUNDAY, MONDAY,... další AM, PM,... 20

java.util.calendar: metody získání instance statické metody getinstance() implicitní time zone getinstance(timezone tz) získání/nastavení času Date gettime() long gettimeinmillis() void settime(date d) void settimeinmillis(long t) porovnávání boolean before(object when) boolean after(object when) 21

java.util.calendar: metody získávání jednotlivých položek int get(int field) př. int day = cal.get(calendar.day_of_month) nastavování jednotlivých položek void set(int field, int value) př. cal.set(calendar.month, Calendar.SEPTEMBER) výsledný čas v milisekundách se přepočítá až při volání get(), gettime(), gettimeinmillis() přidávání k položkám void add(int field, int delta) pokud je třeba, upraví se i ostatní položky výsledný čas v milisekundách se přepočítá ihned přidávání k položkám bez zasahu do vyšších položek void roll(int field, int amount) void roll(int field, boolean up) 22

java.util.timezone reprezentace časového pásma bere v úvahu i letní/zimní čas získání timezone TimeZone getdefault() statická metoda vrátí timezone nastavenou v systému TimeZone gettimezone(string ID) vrátí požadovanou timezone možná ID String[] getavailableids() statická metoda ID jsou tvaru "America/Los_Angeles" GMT +01:00 23

Java java.time 24

java.time náhrada za Calendar od Java 8 Calendar není deprecated instance z java.time jsou obvykle nemodifikovatelné na rozdíl od instancí Calendar Instant okamžik na časové ose vytvoření static Instant now() static Instant ofepochmilli(long milli) static Instant parse(charsequence text) metody plus...(...), minus...(...), int get(temporalfield field) 25

java.time Duration doba mezi dvěma okamžiky př: Instant start = Instant.now();... Instant end = Instant.now(); Duration duration = Duration.between(start, end); vytvoření static Duration ofdays(long days) static Duration ofhours(long hours) static Duration ofminutes(long minutes) metody long todays() long tohours()... 26

java.time LocalDate LocalTime LocalDateTime datum/čas bez informace o časové zóně vytvoření (LocalDate LocalTime LocalDateTime).now() LocalDate.of(int year, int month, int dayofmonth)...of(...) metody plus, minus, get, ZonedDateTime datum a čas s časovou zónou zóna ZoneId 27

java.util Timer 28

Použití plánování úloh pro budoucí vykonání jednou nebo opakovaně úloha = TimerTask všechny úlohy nastavené v jednom Timer objektu se vykonávají jedním vláknem úloha by měla rychle skončit nastavení úlohy void schedule(timertask t, Date d) naplánuje úlohu na daný čas void schedule(timertask t, Date d, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním 29

Použití nastavení úlohy (pokr.) void schedule(timertask t, long delay) naplánuje úlohu na dobu aktuální čas + delay void schedule(timertask t, long delay, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním void scheduleatfixedrate(timertask t, Date d, long period) void scheduleatfixedrate(timertask t, long delay, long period) naplánuje úlohu opakovaně period doba v milisekundách mezi opakovaným spuštěním relativně vzhledem k času prvního vykonaní 30

Použití metoda void cancel() zruší timer další naplánované úlohy se už neprovedou aktuálně prováděná úloha se dokončí lze volat opakovaně další volání nedělají nic třída TimerTask implementuje interface Runnable abstraktní třída nutno implementovat metodu run() další metody void cancel() zruší úlohu long scheduledexecutiontime() čas nejbližšího dalšího spuštění 31

Timer moderněji ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); Runnable task = new Runnable() { public void run() {... } }; scheduler.scheduleatfixedrate(task, 0, 120, SECONDS);... scheduler.shutdown(); 32

java.util java.util.regex 33

java.util.regex regulární výrazy třídy Pattern a Matcher typické použití Pattern p = Pattern.compile("a*b"); Matcher m = p.matcher("aaaaab"); boolean b = m.matches(); Matcher matches() matchuje celý řetězec find() hledá další podsekvenci, která matchuje výraz 34

java.util.regex pozor na speciální znaky např. reg-výraz matchujicí zpětné lomítko "\\\\" "\Q...\E" zrušení významu pro spec. znaky 35

java.util Localization 36

java.util.locale reprezentuje geografický, politický nebo kulturní region určuje, jak vypisovat texty, čísla, měnu, čas,... vytváření Locale(String language) Locale(String language, String country) Locale(String language, String country, String variant) př. new Locale("cs", "CZ") static Locale[] getavailablelocales() vrátí všechny nainstalované locales static Locale getdefault() vratí locale nastavený v systému 37

java.util.resourcebundle obsahuje "lokalizované" objekty např. řetězce bundly vždy patří do skupiny se společným základním jménem př. MyResources plné jméno bundlu = zákl. jméno + identifikace locale př. MyResources_cs, MyResources_de, MyResources_de_CH implicitní bundle pouze se základním jménem každý bundle ve skupině obsahuje stejné věci, ale "přeložené" pro daný locale pokud bundle pro požadovaný locale není, použije se implicitní bundle 38

ResourceBundle: použití získání bundlu ResourceBundle.getBundle("MyResources") ResourceBundle.getBundle("MyResources", currentlocale) bundle obsahuje dvojice klíč/hodnota klíče jsou pro všechny locale stejné, hodnota je jiná použití ResourceBundle rs = ResourceBundle.getBundle("MyResources");... button1 = new Button(rs.getString("OkKey")); button1 = new Button(rs.getString("CancelKey")); 39

ResourceBundle: použití klíče jsou vždy typu String hodnota je jakákoli získání objektu z bundlu String getstring(string key) String[] getstringarray(string key) Object getobject(string key) př: int[] ai=(int[])rs.getobject("intlist"); ResourceBundle abstraktní třída dvě implementace ListResourceBundle PropertyResourceBundle 40

ListResourceBundle abstraktní třída potomci musí definovat metodu Object[][] getcontents() public class MyResources extends ListResourceBundle { public Object[][] getcontents() {return contents;} static final Object[][] contents = { {"OkKey", "OK"}, {"CancelKey", "Cancel"}, }; } public class MyResources_cs extends ListResourceBundle { public Object[][] getcontents() {return contents;} static final Object[][] contents = { {"OkKey", "OK"}, {"CancelKey", "Zrušit"}, }; } 41

PropertiesResourceBundle není abstraktní při použití se nevytváří žádná třída lokalizované řetězce jsou v souborech jméno souboru základní jméno + locale + ".properties" př. myresources.properties myresources_cs.properties získání bundlu ResourceBundle.getBundle("myresources") formát souboru klíč=hodnota # komentář do konce řádku 42

Vlastní implementace potomek přímo od ResourceBundle předefinovat metody Object handlegetobject(string key) Enumeration getkeys() public class MyResources extends ResourceBundle { public Object handlegetobject(string key) { if (key.equals("okkey")) return "Ok"; if (key.equals("cancelkey")) return "Cancel"; return null; } } public class MyResources_cs extends ResourceBundle { public Object handlegetobject(string key) { // nemusí definovat všechny klíče if (key.equals("cancelkey")) return "Zrušit"; return null; } } 43

Java, zimní semestr Verze prezentace 2017 J11.cz.2017.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 44