Java Enum Java, zimní semestr ,2017 1

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

JAVA V Assertions Java, zimní semestr

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

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

JAVA V Anotace Java, zimní semestr ,2014 1

JAVA. Krátke poznámky:

Úvod do programovacích jazyků (Java)

JAVA V Anotace Java, zimní semestr ,2016 1

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

Generické programování

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

JAVA V Anotace Java, zimní semestr ,2015 1

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

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

Výčtový typ strana 67

Java Výjimky Java, zimní semestr

Iterator & for cyklus

typová konverze typová inference

Principy objektově orientovaného programování

Algoritmizace a programování

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

KTE / ZPE Informační technologie

Seminář Java IV p.1/38

Pokročilé programování na platformě Java. Úvod

Java - řazení objektů

JAVA V jar Java, zimní semestr

Teoretické minimum z PJV

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

Java Řetězce Java, zimní semestr

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

Objekty v PHP 5.x. This is an object-oriented system. If we change anything, the users object.

Java efektivně. Lukáš Zapletal liberix.cz. Pokročilejší techniky programování v Javě

Typický prvek kolekce pro české řazení

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

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

Generické typy. Podrobněji: The Java Language Specification ( Third Edition ) , 18

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

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/

11. Dědičnost. Dědičnost strana 103

Programování v Javě I. Leden 2008

20. Projekt Domácí mediotéka

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

PREPROCESOR POKRAČOVÁNÍ

Abstraktní třída a rozhraní

Návrh softwarových systém. Návrh softwarových systémů

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Seminář Java II p.1/43

1. Programování proti rozhraní

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

Abstraktní datové typy: zásobník

3. Třídy. Základní pojmy objektového programování. Třídy

Jazyk C# (seminář 6)

Jazyk C# (seminář 3)

OOP - Objektově Orientované Programování

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

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

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.

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

Objektově orientované programování v PHP 5. Martin Klíma

Programovací jazyk Java

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

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

RMI Remote Method Invocation

Úvod do programovacích jazyků (Java)

UJO Framework. revoluční architektura beans. verze

Třídy a dědičnost. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

Návrhové vzory Tvorba objektů

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

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

4IT101 otázky k závěrečnému testu verze pro zimní semestr 2007/2008

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

1. Dědičnost a polymorfismus

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

9. Polymorfismus a rozhraní

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

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

Úvodní informace. Petr Hnětynka 2/2 Zk/Z

Dědění, polymorfismus

Objektově orientované programování

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

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

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

JAVA Unit testing Java, zimní semestr

OOPR_05. Případové studie

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

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

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

Základy objektové orientace I. Únor 2010

GUI. Systémová integrace pro desktopové aplikace

Programování v jazyku Java hierarchie tříd, přetypování, výjimky

PB161 Programování v jazyce C++ Přednáška 10

8 Třídy, objekty, metody, předávání argumentů metod

Reflexe. Aplikační programování v Javě (BI-APJ) - 8 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

JAVA JavaBeans Java, letní semestr

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

Zápis programu v jazyce C#

Programování v jazyku Java základy OOP

Transkript:

Java Enum 1

Výčty <= Java 1.4 public static final int COLOR_BLUE = 0; public static final int COLOR_RED = 1; public static final int COLOR_GREEN = 2; možné problémy typová (ne)bezpečnost žádný namespace konstanty napevno přeložené v klientech při výpisu jen hodnoty 2

Enum public enum Color { BLUE, RED, GREEN... public Color clr = Color.BLUE; normální třída atributy, metody, i metoda main potomek třídy java.lang.enum pro každou konstantu - jedna instance public static final atribut protected konstruktor 3

Enum bez enumu jak udělat enum v Java 1.4 (a jak je enum implementovaný) class Color { private int value; public static final Color RED = new Color(0); public static final Color GREEN = new Color(1); public static final Color BLUE = new Color(2); protected Color(int v) { value = v;... 4

java.lang.enum public abstract class Enum <E extends Enum<E>> {... metody String name() int ordinal() každý enum má metodu values() vrací pole se všemi konstantami public Colors clr = Colors.BLUE; System.out.println(clr); BLUE 5

Atributy a metody public enum Planet { MERCURY (3.303e+23, 2.4397e6), VENUS (4.869e+24, 6.0518e6), EARTH (5.976e+24, 6.37814e6),... private final double mass; private final double radius; Planet(double mass, double radius){ this.mass = mass; this.radius = radius; double surfacegravity() { return G * mass / (radius * radius); 6

Atributy a metody příklad public enum Operation { PLUS, MINUS, TIMES, DIVIDE; double eval(double x, double y){ switch(this) { case PLUS: return x + y; case MINUS: return x - y; case TIMES: return x * y; case DIVIDE: return x / y; throw new AssertionError("Unknown op: " + this); 7

Atributy a metody abstraktní metody konkretní implementace u každé konstanty 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;; abstract double eval(double x, double y); 8

Java Proměnný počet parametrů 9

... tři tečky pouze jako poslední parametr lze předat pole nebo seznam parametrů v metodě dostupné jako pole void argtest(object... args) { for (int i=0;i <args.length; i++) { System.out.println(args[i]); argtest("ahoj", "jak", "se", "vede"); argtest(new Object[] {"Ahoj", "jak", "se", "vede"); metoda printf System.out.printf("%s %d\n", user, total); 10

Příklad Jsou volaní ekvivalentní? argtest("ahoj", "jak", "se", "vede"); argtest(new Object[] {"Ahoj", "jak", "se", "vede"); argtest((object) new Object[] {"Ahoj", "jak", "se", "vede"); a) Všechna ekvivalentní b) Ekvivalentní 1. a 2. c) Ekvivalentní 2. a 3. d) Každé dělá něco jiného 11

JAVA Anotace 12

Anotace (metadata) od Java 5 umožňují přidat informace k elementům v programu (ke třídám, metodám, atributům,...) obecně lze použít všude tam, kde lze napsat nějaký modifikátor viditelnosti ale i jinde zapisují se @JmenoAnotace lze definovat vlastní určit, kde je lze napsat, jak používat,... předdefinované anotace v balíku java.lang @Deprecated @Override @SuppressWarnings... 13

Anotace mohou mít parametry @Deprecated(since="1.2", forremoval=true) parametry mohou mít implicitní hodnoty tj. není nutné uvést hodnotu @Deprecated kde lze použít třídy, atributy, metody, parametry metod, balíčky použití typů lze omezit v definici anotace 14

Předdefinované anotace @Override označení, že metoda předefinovává metodu z předka pokud nic nepředefinovává => kompilátor odmítne třídu přeložit použití je volitelné (nicméně silně doporučené) class A { public void foo() { class B extends A { @Override public void foo() { interface Ice { class D { void foo() { public void foo() { class C implements Ice { class E extends D { @Override @Override public void foo() { public void bar() { 15

Předdefinované anotace @Deprecated označení API, které by se nemělo používat při použití => varování při překladu parametry String since default "" boolean forremoval default false 16

Předdefinované anotace @SuppressWarnings zamezí vypisování varování při překladu parametr třída varování String[] value podporované třídy jsou závislé na překladači vždy dostupné třídy varování unchecked varovaní při nevhodném používání generických typů deprecation varování při použití deprecated elementů př. @SuppressWarnings( unchecked ) @SuppressWarnings({ unchecked, deprecation ) 17

JAVA Lambda výrazy 18

Motivace obsluha událostí v GUI implementace komparátoru implementace vlákna vždy interface s jednou metodou běžně pomocí anonymní vnitřní třídy interface Comparator<T> { int compare(t o1, T o2); class Arrays {... void sort(t[] a, Comparator<T> c); Arrays.sort(array, new Comparator<AClass> () { public int compare(aclass o1, AClass o2) { return o1.x - o2.x; ); 19

Motivace předchozí příklad pomocí lambda výrazů Arrays.sort(array, (o1, o2) -> o1.x - o2.x ); zjednodušeně: lambda výraz ~ blok kódu s parametry od Java 8 20

Funkcionální interface kde lze lambda výrazy použít? tam, kde se očekává instance interfacu s jednou abstraktní metodou = funkcionální interface lambda výraz je instance funkcionálního interfacu ale lambda výraz neobsahuje informaci o tom, který funkcionální interface implementuje 21

Funkcionální interface interface Predicate<T> { default Predicate<T> and(predicate<? super T> other); static <T> Predicate<T> isequal(object targetref); default Predicate<T> negate(); default Predicate<T> or(predicate<? super T> other); boolean test(t t); Je to funkcionální interface? ano pouze jedna abstraktní metoda 22

Typ lambda výrazu stejný lambda výraz lze přiřadit do různých interfaců Runnable r = () -> {; AutoCloseable r = () -> {; public interface Runnable { void run(); public interface AutoCloseable { void close(); 23

Typ lambda výrazu lambda výrazy jsou objekty Runnable r = () -> {; Object o = r; ale lambda výrazy nelze (přímo) přiřadit do typu Object Object r = () -> {; protože Object není funkcionální interface 24

Syntaxe lambda výrazu seznam parametrů v závorkách typy lze vynechat při jednom parametru lze závorky vynechat šipka -> tělo jeden výraz lze vynechat return bez závorek nelze vynechat, pokud je použit return blok ve složených závorkách 25

Příklady lambda výrazů (int x, int y) -> x + y (x, y) -> x - y () -> 42 (String s) -> System.out.println(s) x -> 2 * x c -> { int s = c.size(); c.clear(); return s; 26

Funkcionální interface @FunctionalInterface anotace pro označení funkcionálního interface použití není nutné podobně jako @Override 27

Reference na metody String::valueOf reference na statickou metodu ekvivalent: x -> String.valueOf(x) Object::toString reference na nestatickou metodu ekvivalent: x -> x.tostring() x::tostring reference na metodu konkrétního objektu ekvivalent: () -> x.tostring() ArrayList::new reference na konstruktor ekvivalent: () -> new ArrayList<>() 28

Lambda výrazy lambda výrazy nepřidávají nový prostor (scope) viditelnosti proměnných Path first = Paths.get("/usr/bin"); Comparator<String> comp = (first, second) -> Integer.compare(first.length(), second.length()); this v lambda výrazu odkazuje na this metody, ve které je výraz vytvořen public class Application { public void dowork() { Runnable runner = () -> {System.out.println(this.toString());; 29

Překlad lambda výrazů public class AClass {... public void foo(aclass[] array) { Arrays.sort(array, new Comparator<AClass> () { public int compare(aclass o1, AClass o2) { return o1.x - o2.x; ); javac AClass.java => AClass.class AClass@1.class ale public class AClass {... public void foo(aclass[] array) { Arrays.sort(array, (o1, o2) -> o1.x - o2.x); javac AClass.java => AClass.class 30

JAVA java.lang.object 31

Metody clone equals finalize getclass hashcode notify notifyall tostring wait 32

equals boolean equals(object obj) pozor na signaturu metody definována s parametrem typu Object při předefinovávání je nutno zachovat typ Object příklad class Complex { long x,y; public boolean equals(object obj) { if (obj instanceof Complex) { Complex c = (Complex) obj; if (c.x == x && c.y == y) { return true; return false; 33

equals je vhodné definovat metodu s anotací @Override @Override public boolean equals(object obj) při definici s jiným typem je metoda přetížena, ale ne předefinována class Complex { long x,y; public boolean equals(complex obj) {... třída obsahuje 2 metody equals 34

hashcode int hashcode() hashovací kód objektu používá se např. v java.util.hashtable a dalších pro stejný objekt vrací stále stejnou hodnotu nemusí být stejná mezi různými běhy programu pokud jsou dva objekty stejné ve smyslu metody equals(), pak hashcode musí vracet u obou stejné číslo dva různé objekty nemusí mít nutně různý hashcode je to ale velmi vhodné 35

clone Object clone() throws CloneNotSupportedException vytvoří kopii objektu platí x.clone()!= x mělo by platit (ale nemusí) x.clone().equals(x) aby metoda fungovala, musí objekt implementovat interface Cloneable jinak vyhodí výjimku CloneNotSupportedException pole se berou jako by implementovali Cloneable "klonují" se jen objekty, ne jejich atributy mělká kopie pokud chcete jinak, je nutno metodu předefinovat 36

clone předefinování clone typická implementace ne nezbytně nutná protected Object clone() { Object clonedobj = super.clone();... return clonedobj; při klonování by mělo platit a.clone()!= a a.clone().equals(a) 37

tostring vrací textovou reprezentaci objektu implicitně vrací getclass().getname() + '@' + Integer.toHexString(hashCode()) vhodné předefinovat class MyClass {...... MyClass o = new MyClass(); System.out.println(o); // zavola se tostring() 38

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