JAVA V Assertions Java, zimní semestr

Podobné dokumenty
JAVA. Zdrojové soubory

Parametrizované třídy Generics generické třídy. JDK zavádí mimo jiné tzv. parametrizované třídy - generics

Java. Generické typy

Java Enum Java, zimní semestr ,2017 1

Java. Platformy apod.

Java. Platformy apod.

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

Generické programování

Iterator & for cyklus

JAVA. Krátke poznámky:

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

Úvod do programovacích jazyků (Java)

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

Algoritmizace a programování

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/

typová konverze typová inference

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

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

1. Programování proti rozhraní

Seminář Java IV p.1/38

7. Dynamické datové struktury

Výčtový typ strana 67

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

Abstraktní datové typy: zásobník

Generické programování v jazyce Java Generics programming in Java

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

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

Principy objektově orientovaného programování

20. Projekt Domácí mediotéka

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

Zápis programu v jazyce C#

Programování v Javě I. Leden 2008

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

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

Návrhové vzory Tvorba objektů

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

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

Úvod do programovacích jazyků (Java)

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

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

Teoretické minimum z PJV

9. přednáška - třídy, objekty

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

Java Řetězce Java, zimní semestr

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.

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

Programovací jazyk Java

Osnova přednášky. Programové prostředky řízení Úvod do C# II. Přístup ke členům. Členy (Members)

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

boolean hasnext() Object next() void remove() Kolekce

Seminář Java II p.1/43

Abstraktní třída a rozhraní

PREPROCESOR POKRAČOVÁNÍ

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

Dědičnost (inheritance)

Jazyk C# (seminář 6)

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.

Typický prvek kolekce pro české řazení

Algoritmizace a programování

Jazyk C# (seminář 3)

UJO Framework. revoluční architektura beans. verze

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

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

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

Novinky, s nimiž přichází Java 5.0

Úvod do programování - Java. Cvičení č.4

RMI Remote Method Invocation

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

JAVA Unit testing Java, zimní semestr

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

KTE / ZPE Informační technologie

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

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

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

KTE / ZPE Informační technologie

17. Projekt Trojúhelníky

Přehled probírané látky

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

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

Dědění, polymorfismus

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

Regulární výrazy. Vzory

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

OOPR_05. Případové studie

Java - řazení objektů

Paměť počítače. alg2 1

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

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

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

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

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

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

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

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

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

Transkript:

JAVA Assertions 1

Assertion od Java 1.4 příkaz obsahující výraz typu boolean programátor předpokládá, že výraz bude vždy splněn (true) pokud je výraz vyhodnocen na false -> chyba používá se pro ladění assertions lze zapnout nebo vypnout pro celý program nebo jen pro některé třídy implicitně vypnuty nesmí mít žádné vedlejší efekty javac 1.4 programy se musejí překládat s parametrem -source 1.4 2

Použití assert Vyraz1; assert Vyraz1 : Vyraz2; vypnuté assertions příkaz nedělá nic výrazy se nevyhodnocují! zapnuté assetions Výraz1 je true nic se neděje, program pokračuje normálně Výraz1 je false Výraz2 je přítomen throw new AssertionError(Vyraz2) Výraz2 není přítomen throw new AssertionError() 3

Zapnutí a vypnutí parametry pro virtual machine zapnutí -ea[:packagename... :ClassName] -enableassertions[:packagename... :ClassName] vypnutí -da[:packagename... :ClassName] -disableassertions[:packagename... :ClassName] bez třídy nebo balíku pro všechny třídy assertions v "systémových" třídách -esa -enablesystemasserions -dsa -disablesystemasserions zda se mají assetions provádět, se určí pouze jednou při inicializaci třídy (předtím, než se na ní cokoliv provede) 4

java.lang.assertionerror dědí od java.lang.error konstruktory AssertionError() AssertionError(boolean b) AssertionError(char c) AssertionError(double d) AssertionError(float f) AssertionError(int i) AssertionError(long l) AssertionError(Object o) 5

Příklady použití invarianty if (i%3 == 0) {... else if (i%3 == 1) {... else { assert i%3 == 2;... 6

Příklady použití "nedosažitelná místa" v programu class Directions { public static final int RIGHT = 1; public static final int LEFT = 2;... switch(direction) { case Directions.LEFT:... case Directions.RIGHT:... default: assert false; 7

Příklady použití preconditions testování parametrů private metod private void setinterval(int i) { assert i>0 && i<=max_interval;... nevhodné na testování parametrů public metod public void setinterval(int i) { if (i<=0 && i>max_interval) throw new IllegalArgumentException();... 8

Příklady použití postconditions public String foo() { String ret;... assert ret!= null; return ret; 9

Java Generické typy 10

Úvod obdoba šablon z C#/C++ ale jen na první pohled parametry pro typy cíl přehlednější kód typová bezpečnost 11

Motivační příklad bez gen. typů (<=Java 1.4) List myintlist = new LinkedList(); myintlist.add(new Integer(0)); Integer x = (Integer)myIntList.iterator().next(); >= Java 5 List<Integer> myintlist = new LinkedList<Integer>(); myintlist.add(new Integer(0)); Integer x = myintlist.iterator().next(); bez explicitního přetypování kontrola typů během překladu 12

Definice generických typů public interface List<E> { void add(e x); Iterator<E> iterator(); E get(int i); public interface Iterator<E> { E next(); boolean hasnext(); List<Integer> si lze představit jako public interface IntegerList { void add(integer x); Iterator<Integer> iterator(); ve skutečnosti ale takový kód nikde neexistuje negeneruje se kód jako C++ 13

Vytváření objektů ArrayList<Integer> list = new ArrayList<Integer>(); ArrayList<ArrayList<Integer>> list2 = new ArrayList<ArrayList<Integer>>(); HashMap<String, ArrayList<ArrayList<Integer>>> h = new HashMap<String, ArrayList<ArrayList<Integer>>>(); od Java 7 (operátor diamant ) ArrayList<Integer> list = new ArrayList<>(); ArrayList<ArrayList<Integer>> list2 = new ArrayList<>(); HashMap<String, ArrayList<ArrayList<Integer>>> h = new HashMap<>(); 14

Vztahy mezi typy nejsou povoleny žádné změny v typových parametrech List<String> ls = new ArrayList<String>(); List<Object> lo = ls; lo.add(new Object()); String s = ls.get(0); chyba přiřazení Object do String druhý řadek způsobí chybu při překladu 15

Vztahy mezi typy příklad - tisk všech prvků kolekci <= Java 1.4 void printcollection(collection c) { Iterator i = c.iterator(); for (k = 0; k < c.size(); k++) { System.out.println(i.next()); naivní pokus v Java 5 void printcollection(collection<object> c) { for (Object e : c) { System.out.println(e); nefunguje (viz předchozí příklad) 16

Vztahy mezi typy Collection<Object> není nadtyp všech kolekcí správně void printcollection(collection<?> c) { for (Object e : c) { System.out.println(e); Collection<?> je nadtyp všech kolekcí kolekce neznámého typu (collection of unknown) lze přiřadit kolekci jakéhokoliv typu pozor - do Collection<?> nelze přidávat Collection<?> c = new ArrayList<String>(); c.add(new Object()); <= chyba při překladu volat get() lze - vysledek do typu Object 17

Vztahy mezi typy? - wildcard omezený? (bounded wildcard) public abstract class Shape { public abstract void draw(canvas c); public class Circle extends Shape {... public class Canvas { public void drawall(list<shape> shapes) { for (Shape s:shapes) { s.draw(this) umožní vykreslit pouze seznamy přesně typu List<Shape>, ale už ne List<Circle> 18

Vztahy mezi typy řešení - omezený? public void drawall(list<? extends Shape> shapes){ for (Shape s:shapes) { s.draw(this) do tohoto Listu stále nelze přidávat shapes.add(0, new Rectangle()); chyba při překladu 19

Generické metody static void fromarraytocollection(object[] a, Collection<?> c) { for (Object o : a) { c.add(o); chyba při překladu static <T> void fromarraytocollection(t[] a, Collection<T> c) { for (T o : a) { c.add(o); OK 20

Generické metody použití překladač sám určí typy Object[] oa = new Object[100]; Collection<Object> co = new ArrayList<Object>(); fromarraytocollection(oa, co); // T Object String[] sa = new String[100]; Collection<String> cs = new ArrayList<String>(); fromarraytocollection(sa, cs); // T String fromarraytocollection(sa, co); // T Object i u metod lze použít omezený typ class Collections { public static <T> void copy(list<t> dest, List<? extends T> src){... 21

Pole a generické typy pole gen. typů lze deklarovat nelze naalokovat List<String>[] lsa = new List<String>[10]; nelze! List<?>[] lsa = new List<?>[10]; OK + varování proč - pole lze přetypovat na Object List<String>[] lsa = new List<String>[10]; Object o = lsa; Object[] oa = (Object[]) o; List<Integer> li = new ArrayList<Integer>(); li.add(new Integer(3)); oa[1] = li; String s = lsa[1].get(0); ClassCastException 22

Starý a nový kód starý kód bez generických typů public class Foo { public void add(list lst) {... public List get() {... nový kód používající starý List<String> lst1 = new ArrayList<String>(); Foo o = new Foo(); o.add(lst1); OK - List odpovídá List<?> List<String> lst2 = o.get(); varování překladače 23

Starý a nový kód nový kód s generickými typy public class Foo { public void add(list<string> lst) {... public List<String> get() {... starý kód používající nový List lst1 = new ArrayList(); Foo o = new Foo(); o.add(lst1); varování překladače List lst2 = o.get(); OK - List odpovídá List<?> 24

Další vztahy mezi typy class Collections { public static <T> void copy(list<t> dest, List<? extends T> src){... ve skutečnosti class Collections { public static <T> void copy(list<? super T> dest, List<? extends T> src){... 25

Java Enum 26

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 27

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

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;... 29

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 30

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); 31

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); 32

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); 33

Java Proměnný počet parametrů 34

... 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); 35

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 36

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