Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Podobné dokumenty
Úvod do programovacích jazyků (Java)

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

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

7. Datové typy v Javě

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

Výčtový typ strana 67

Teoretické minimum z PJV

Zapouzdření. Tomáš Pitner, upravil Marek Šabo

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

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

Principy objektově orientovaného programování

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

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

ADT/ADS = abstraktní datové typy / struktury

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Programování v Javě I. Leden 2008

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

Datové struktury. alg12 1

Generické programování

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

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

Jazyk C# (seminář 6)

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

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

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

NA CO SI DÁT POZOR V JAVASCRIPTU? Angular.cz

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

Typický prvek kolekce pro české řazení

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

Výjimky. Tomáš Pitner, upravil Marek Šabo

5 Přehled operátorů, příkazy, přetypování

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

Algoritmizace a programování

PREPROCESOR POKRAČOVÁNÍ

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Programování v jazyce JavaScript

Abstraktní datové typy: zásobník

typová konverze typová inference

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

MQL4 COURSE. By Coders guru -3 DATA TYPES. Doufám, že předchozí lekce SYNTAX se vám líbila. V té jsme se pokoušeli zodpovědět:

Distribuované systémy a výpočty

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

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

Java - výjimky. private void vstup() throws IOException {... }

Seminář Java IV p.1/38

Algoritmizace a programování

Datové typy strana 29

Jazyk C# (seminář 3)

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

Seminář Java II p.1/43

Programování v jazyce JavaScript

Základy objektové orientace I. Únor 2010

Úvod do programovacích jazyků (Java)

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

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

Čipové karty Lekařská informatika

KTE / ZPE Informační technologie

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

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

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Programování v Pythonu

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

Java Řetězce Java, zimní semestr

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

Java - řazení objektů

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

VY_32_INOVACE_08_2_04_PR

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

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

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

Úvod do programování v jazyce Java

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Výchozí a statické metody rozhraní. Tomáš Pitner, upravil Marek Šabo

Struktura programu v době běhu

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

Algoritmizace a programování

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

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

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Proměnné a datové typy

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

OOPR_05. Případové studie

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

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Iterator & for cyklus

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/

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

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

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

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

Obsah přednášky. Příkaz for neúplný. Příkaz for příklady. Cyklus for each (enhanced for loop) Příkaz for příklady

UJO Framework. revoluční architektura beans. verze

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

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

Transkript:

Neměnné objekty Tomáš Pitner, upravil Marek Šabo

Neměnné objekty Neměnný (immutable) objekt nemůže být po jeho vytvoření modifikován Bezpečně víme, co v něm až do konce života bude Tudíž může být souběžně používán z více míst, aniž by hrozily nekonzistence Jsou prostředkem, jak psát robustní a bezpečný kód K jejich vytvoření nepotřebujeme žádný speciální nástroj Příklad neměnného objektu public class Vertex1D { private int x; public Vertex1D(int x) { this.x = x; } public int getx() { return x; } }... Vertex1D v = new Vertex1D(1); // x of value 1 cannot be changed anymore Výhody a nevýhody Výhody je to vláknově bezpečné (thread safe) objekt může být bezpečně používán více vlákny naráz programátor má jistotu, že se mu obsah objektu nezmění silný předpoklad kód je čitelnější, udržovanější i bezpečnější (např. útočník nemůže změnit náš token) Nevýhody chceme-li objekt byť jen drobně změnit, musíme vytvořit nový to stojí čas a paměť Porovnání Neměnný objekt vs. konstanta konstanta je jenom jedna (je statická) neměnných objektů může být víc s různými hodnotami kdyby jich bylo více a měly stejnou hodnotu, postrádá smysl 1

Neměnný objekt vs. final final prakticky zakáže změnu odkazu nelze tedy do dané proměnné přiřadit odkaz na jiný objekt samotný objekt ale může být dál "vevnitř" modifikován Příklad final final Person p = new Person("Marek"); // p = new Person("Jan"); // cannot be done p.setname("haha I changed it"); // this works! Vestavěné neměnné třídy Neměnnou třídou v Javě je String. Má to řadu dobrých důvodů - tytéž jednou definované řetězce lze používat souběžně z více míst programu Nicméně i negativní stránky - někdy větší režie spojená s nemodifikovatelností: String s = "Hello " + "World"; Kód vytvoří 3 objekty: "Hello ", "World" a "Hello World". Cože? To je tak neefektivní? Pokud by vysloveně vadilo, lze místo String použít StringBuilder, který je modifikovatelný (mutable), viz dále String pod lupou Podívejme se na rozdíl "Hello" a new String("Hello"). new String("Hello") vytvoří pokaždé nový objekt "Hello" funguje na principu: jestli taký objekt zatím neexistuje, tak ho vytvořím, jinak vrátím odkaz na již existující objekt (uložen v paměti String constant pool) 2

String s1 = "Hello"; String s2 = "Hello"; boolean btrue = (s1 == s2); // true, identical objects s1 = new String("Hello"); s2 = new String("Hello"); boolean bfalse = (s1 == s2); // false, different objects though with same value Metody třídy String char charat(int index) vráti prvek na daném indexu static String format(string format, Object args) stejné jako printf v C boolean isempty() vráti true jestli je prázdný int length() velikost řetězce matches, split, indexof, startswith Více metod najdete v dokumentaci třídy String. Doporučujeme javadoc prostudovat, používaním existujících metod jsi ušetříte spoustu práce! Třída StringBuilder StringBuilder builder = new StringBuilder("Hello "); builder.append("cruel ").append("world"); // method chain builder.append("!"); String result = builder.tostring(); StringBuilder se průběžně modifikuje, přidáváme do něj další znaky Na závěr vytvoříme výsledný řetězec StringBuilder není thread safe, proto existuje její varianta StringBuffer. Objektové obálky nad primitivními hodnotami Java má primitivní typy int, char, double, Ke každému primitivnímu typu existuje varianta objektového typu Integer, Character, Double, Tyto objektové typy se nazývají wrappers. Objekty jsou neměnné 3

Při vytváření takových objektů není nutné používat new, využije se tzv. autoboxing, např. Integer five = 5; Obdobně autounboxing, int alsofive = five; Integer objectint = new Integer(42); Integer objectint2 = 42; Konstanty objektových obálek Wrappers (např. Double) mají různé konstanty: MIN_VALUE je minimální hodnota jakou může double obsahovat POSITIVE_INFINITY reprezentuje konstantu kladné nekonečno NaN je zkratkou Not-a-Number dostaneme ji např. dělením nuly Protože konstanty jsou statické, jejich hodnoty získáme přes název třídy: double d = Double.MIN_VALUE; d = Double.NEGATIVE_INFINITY; Metody objektových obálek např. pro Double existuje static double parsedouble(string s) udělá ze String číslo, z "1.0", vytvoří číslo 1.0 obdobně pro Integer a další číselné typy pro převody na číselné typy dále int intvalue() převod double do typu int boolean isnan() test, jestli není hodnotou číslo Více konstant a metod popisuje javadoc. Víc hodnot Test: Objektové typy (Integer) mají od primitivních (int) jednu hodnotu navíc uhádněte jakou! je to null Integer je objektový typ, proměnná je odkaz na objekt Rozdíl od primitivních typů Proč tedy vůbec používat primitivní typy, když máme typy objektové? 4

int i = 1 zabere v paměti právě jen 32 bitů používáme přímo danou paměť, jednička je uložena přímo v i Integer i = 1 je třeba alokace paměti pro objekt, zkonstruování objektu s obsahem 1 v proměnné i je pouze odkaz, je to (nepatrně) pomalejší Výkon může být u velkého počtu objektů problém, např. vytvoření miliónu proměnných typu Integer namísto int může mít dopad na výkon a zcela jistě zabere dost paměti, asi zbytečně Doporučení Používejte hlavně primitivní typy Využívejte metody objektových typů, hlavně statické, kde není třeba mít objekt Řada objektových jazyků vůbec primitivní typy jako v Javě nemá, vše jsou objekty Přechod mezi primitivními a objektovými typy Java podporuje automatické balení (boxing) a vybalení (unboxing) mezi primitivními typy a wrappery. Proto je následující kód je naprosto v pořádku int primitiveint = 42; Integer objectint = primitiveint; primitiveint = new Integer(43); Jak už bylo řečeno, použití primitivního typu je obvykle lepší nápad - jsme v Javě :-) Zvláštnosti Zajímavost, anebo spíš podraz Javy: Integer i1 = 100; // between -127 and 128 Integer i2 = 100; boolean referencesareequal = (i1 == i2); // true i1 = 300; i2 = 300; boolean referencesnotequal = (i1 == i2); // false Poučení: objekty pomocí == obvykle neporovnáváme (budeme se učit o equals). 5