Výčtový typ strana 67



Podobné dokumenty
Programovací jazyk Java

typová konverze typová inference

Úvod do programovacích jazyků (Java)

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

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

Seminář Java IV p.1/38

15. Projekt Kalkulačka

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

20. Projekt Domácí mediotéka

Java - řazení objektů

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

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

Programování v Javě I. Leden 2008

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

9. Polymorfismus a rozhraní

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

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

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

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

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

Seminář Java II p.1/43

17. Projekt Trojúhelníky

PREPROCESOR POKRAČOVÁNÍ

Abstraktní třída a rozhraní

Generické 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/

Objektově orientované programování

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

7. Dynamické datové struktury

1. Programování proti rozhraní

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

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

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

Dědičnost (inheritance)

Algoritmizace a programování

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

Datové struktury. alg12 1

Teoretické minimum z PJV

Algoritmizace a programování

Datové typy strana 29

Zápis programu v jazyce C#

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

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

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

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

Algoritmizace a programování. Terminálový vstup a výstup

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

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

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

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

Dynamicky vázané metody. Pozdní vazba, virtuální metody

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

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

Jazyk C++ I. Polymorfismus

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

Regulární výrazy. Vzory

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

19. Projekt Adventura

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

KTE / ZPE Informační technologie

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

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

Úvod do programovacích jazyků (Java)

Abstraktní datové typy: zásobník

Jazyk C# (seminář 3)

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

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

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

7. Datové typy v Javě

Java Enum Java, zimní semestr ,2017 1

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

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

ADT/ADS = abstraktní datové typy / struktury

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Projekt Škola strana 179

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

Algoritmizace a programování

Soubor jako posloupnost bytů

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

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

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

1. Téma 03 - Rozhodování

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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.

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

Jazyk C# (seminář 6)

10 Balíčky, grafické znázornění tříd, základy zapozdření

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

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

5 Rekurze a zásobník. Rekurzivní volání metody

Přehled probírané látky

Funkční objekty v C++.

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

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

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

KTE / ZPE Informační technologie

Transkript:

Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce či přípustné parametry na příkazové řádce. Jedná se o seznamy, které se nemění za běhu aplikace pokud se seznam změní (např. přibude další parametr příkazové řádky), musí se program znovu přeložit. Nebudeme se zde zabývat seznamy, kterým se za běhu programu počet prvků mění (např. seznamy studentů, seznamy místností, seznamy věcí). Nejdříve si ukážeme implementaci seznamu pomocí celočíselných pojmenovaných konstant, většina kapitoly je věnována výčtovému typu, který je novinkou ve verzi Javy 5.0. 8.1. Pojmenované konstanty Pro vyjádření seznamu přípustných hodnot lze použít celočíselné pojmenované konstanty. U pojmenovaných konstant se uvádějí modifikátory final (hodnotu konstanty nelze změnit), static (konstanty jsou nezávislé na instancích) a obvykle i public konstanty bývají veřejně dostupné, což opět souvisí s jejich neměnitelností. Ukážeme si je na příkladu se dny v týdnu: public static final int DEN_NEDELE=0; public static final int DEN_PONDELI=1; public static final int DEN_UTERY=2; public static final int DEN_STREDA=3; public static final int DEN_CTVRTEK=4; public static final int DEN_PATEK=5; public static final int DEN_SOBOTA=6; Tyto konstanty použijeme při vkládání termínů do rozvrhu. Hlavička metody by mohla vypadat takto: public void pridejtermin(int den, String odkdy, String dokdy, String popis) { // obsah metody Vlastní přidávání termínů může vypadat takto: rozvrh.pridejtermin(den_pondeli, "14:30", "16:00", rozvrh.pridejtermin(den_utery, "12:45", "14:15", Použití pojmenovaných konstant pro vyjádření seznamu hodnot má ale několik nevýhod: řešení není typově bezpečné bez upozornění se přeloží i následující kód: rozvrh.pridejtermin(999, "14:30", "16:00", řešení nepodporuje vkládání konstant pokud se do seznamu konstant vloží nová konstanta či pokud se změní pořadí konstant, musí se znovu přeložit všechny třídy, které konstanty používají, při tisku mají malou vypovídací hodnotu v našem příkladu se vytiskne číslo a ne např. pondělí či DEN_PONDELI. Pojmenované konstanty se používají i v jiných situacích, např. pro vyjádření matematických konstant. V těchto případech mají své opodstatnění a samozřejmě nelze hovořit o výše uvedených nevýhodách.

Výčtový typ strana 68 8.2. Výčtový typ (enum) V Javě 5.0 byl zaveden výčtový typ enum, který řeší většinu nevýhod pojmenovaných konstant pro vytvoření uzavřené množiny neměnných hodnot. Základní deklarace výčtového typu je velmi jednoduchá: [public] enum název { hodnota1, hodnota2,... Výčto vý typ se obvykle deklaruje v samostatném souboru podobně jako třídy či rozhraní. Soubor se musí jmenovat stejně jako výčtový typ. Jméno výčtového typu by mělo začínat velkým písmenem, jména vlastních hodnot by měly být velkými písmeny obdobně jako pojmenované konstanty. V deklaraci výčtového typu se též obvykle používá i modifikátor přístupu public. Následuje příklad deklarace výčtového typu pro jednotlivé dny v týdnu: public enum DenVTydnu { NEDELE, PONDELI, UTERY, STREDA, CTVRTEK, PATEK, SOBOTA Při použití tohoto výčtového typu v rozvrhu musíme upravit hlavičku a částečně asi i obsah metody pridejtermin(). V hlavičce metody bude první parametr výčtového typu DenVTydnu: public void pridejtermin(denvtydnu den, String odkdy, String dokdy, String popis) { // obsah metody Vlastní přidávání termínů bude nyní vypadat takto: rozvrh.pridejtermin(denvtydnu.pondeli, "14:30", "16:00", rozvrh.pridejtermin(denvtydnu.utery, "12:45", "14:15", Řešení s výčtovým typem: je typově bezpečné nelze za den v týdnu doplnit hodnotu, která není ve výčtovém typu, je odolnější vůči změnám výčtového typu pokud se změní pořadí hodnot ve výčtovém typu či se dovnitř seznamu vloží další hodnota, není potřeba překládat třídy, které výčtový typ používají. při t isku se vytiskne smysluplnější hodnota, vytiskne se vlastní konstanta (např. PONDELI ). V diagramu tříd se vyznačí výčtový typ s použitím stereotypu: Obrázek 8.1 Diagram tříd s výčtovým typem

Výčtový typ strana 69 8. 3. Metody výčtového typu Výčtový typ patří mezi referenční typy, konkrétně je speciálním potomkem třídy Object, hodně se podobá třídám. Na rozdíl od tříd a rozhraní však nepodporuje dědičnost nelze vytvořit výčtový typ, kt erý by byl potomkem jiného výčtového typu. Jako p otomek třídy Object obsahuje výčtový typ též všechny metody třídy Object metody tostring(), equals(), hashcode() a další. Výčtový typ má několik dalších metod. Statická metoda values() vrací výčet všech hodnot výčtového t ypu. Použív á se pro procházení výčtového typu pomocí cyklu for. Následující kód vypíše všechny hodnoty výčtového typu DenVTydnu (vypíše všechny dny): for ( DenVTydnu den : DenVTydnu.values() ) { System.out.println(den); U výčtových typů lze používat statickou metodu valueof(), která vrátí prvek výčtového typu odpovídající zadanému řetězci. Pokud se nenajde prvek výčtového typu pro zadaný řetězec, vznikne výjimka IllegalArgumentException. Při vyhledávání prvku se kontroluje velikost písmen. V následujícím kódu vznikne na druhém řádku výjimka: DenVTydnu sobota = DenVTydnu.valueOf("SOBOTA"); DenVTydnu nedele = DenVTydnu.valueOf("nedele"); // výjimka!!! Výčtový typ též implementuje rozhraní Comparable a tudíž obsahuje metodu compareto() dle výčtového typu je možné třídit. Prvky se řadí dle pořadí, v jakém jsou uvedeny ve výčtovém typu. V našem příkladu se dny by se rozvrh řadil od neděle do soboty. 8.4. Rozšíření příkazu switch V souvislosti s výčtovým typem byl též rozšířen příkaz switch lze v něm uvést vedle celočíselných primitivních typů a typu char i výčtový typ. I u výčtového typu je vhodné vždy uvádět větev default a to i v případě, že vyjmenujeme všechny přípustné hodnoty je to určitá ochrana pro případ přidání další hodnoty do výčtového typu. V následujícím příkazu switch se odlišuje víkend od pracovních dní (je to i jedna z mála situací, kdy ve větvích case není vždy uveden příkaz brek): // proměnná den je typu DenVTydnu switch (den) { case NEDELE: case SOBOTA: System.out.println("víkend"); break; case PONDELI: case UTERY: case STREDA: case CTVRTEK: case PATEK: System.out.println("pracovní den"); break; default : System.out.println("takový den neznám"); Všimněte si, že za slovem case se píší konkrétní konstanty výčtového typu bez odkazu na vlastní výčtový typ. 8.5. Výčtový typ uvnitř třídy V některých situacích potřebujeme seznam přípustných hodnot pouze uvnitř nějaké třídy nechceme, aby výčtový typ byl veřejně dostupný. Řešením je definice výčtového typu uvnitř třídy. Ukážeme si to na příkladu se znaménky pro matematické operace:

Výčtový typ strana 70 1 public class Vypocet { 2 3 private enum Operace { PLUS, MINUS, NASOBENO, DELENO 4 5 public double vypocet (Operace operace, double prvni, 6 double druhy) { 7 switch (operace) { 8 case PLUS: return prvni + druhy; 9 case MINUS: return prvni - druhy; 10 case NASOBENO: return prvni * druhy; 11 case DELENO: return prvni/druhy; 12 default : return 0; 13 14 15 public static void main (String... args) { 16 Vypocet spocti = new Vypocet(); 17 System.out.println("3 PLUS 5 = " + 18 spocti.vypocet(operace.plus, 3, 5)); 19 20 Pokud je výčtový typ definován uvnitř třídy, je možné v deklaraci uvést všechny modifikátory přístupu (tedy i private a protected) v tomto případě se chovají stejně, jako u datových atributů. V závislosti na modifikátoru lze deklarovaný výčtový typ používat i v potomcích hlavní třídy (v našem případě v potomcích třídy Vypocet). Pokud chceme, aby výčtový typ byl veřejně dostupný, měl by být definovaný v rámci samostatného souboru a ne uvnitř nějaké třídy. 8.6. Výčtový typ a datové struktury Pokud chceme ukládat výčtový typ do množin či ho používat jako klíč v mapách (viz kapitola 10), poskytuje Java v balíčku java.util speciální rychlé implementace množiny a mapy třídy EnumSet a EnumMap. Třída EnumSet má navíc metodu range(), kterou lze použít pro procházení pouze části seznamu prvků ve výčtovém typu. V následujícím příkladu se vypíší pouze pracovní dny: for (Den den : EnumSet.range(Den.PONDELI, Den.PATEK)) { System.out.println(den); Třída EnumSet dále podporuje některé základní operace s množinami výčtových typů. 8.7. Rozšiřování výčtového typu Výčtové typy nemusí být tak jednoduché, jak jsme si doposud ukazovali. K hodnotám ve výčtovém typu lze přiřazovat další parametry (např. k planetám lze přiřadit vzdálenost od slunce, k názvům barev lze doplnit jejich označení pomocí RGB), výčtový typ lze rozšiřovat o další metody či překrývat již existující metody. Tato problematika je však již poměrně komplikovaná a proto doporučujeme ji nastudovat z dokumentace u firmy Sun. My si zde ukážeme pouze jednoduchý příklad, ve kterém překryjeme metodu tostring(), aby vypisovala dny v týdnu malými písmeny:

Výčtový typ strana 71 public enum Den { NEDELE, PONDELI, UTERY, STREDA, CTRVTEK, PATEK, SOBOTA; public String tostring() { return name().tolowercase();

Výčtový typ strana 72