16. diel - Diár s databázou v Jave - Metódy diára, výnimky a final
V minulej lekcii, Diár s databázou v Jave - Záznam, databáza a diár , sme rozpracovali jednoduchý diár s
databázou pomocou kolekcie ArrayList
.
V dnešnom tutoriáli aplikáciu dokončíme.
Trieda Diar
Do triedy Diar
pridajme dve pomocné metódy
naparsujDatumCas()
a naparsujDatum()
, ktoré vyzvú
používateľa na zadanie dátumu (a prípadne času) a vráti inštanciu
LocalDateTime
nastavenú na túto hodnotu. Najprv si metódy
ukážme, čoskoro si ich popíšeme:
private LocalDateTime naparsujDatumCas() { System.out.println("Zadajte dátum a čas v tvare [" + LocalDateTime.now().format(FORMAT_DATA) + "]:"); while (true) { try { return LocalDateTime.parse(scanner.nextLine(), FORMAT_DATA); } catch (Exception ex) { System.out.println("Nesprávne zadané, zadajte prosím znova."); } } } private LocalDateTime naparsujDatum() { System.out.println("Zadajte dátum v tvare [" + LocalDate.now().format(FORMAT_DATA_BEZ_CASU) + "]:"); while (true) { try { return LocalDate.parse(scanner.nextLine(), FORMAT_DATA_BEZ_CASU).atStartOfDay(); } catch (Exception ex) { System.out.println("Nesprávne zadané, zadajte prosím znova."); } } }
Pridáme ešte potrebné importy:
import java.time.LocalDateTime; import java.time.LocalDate;
Ako prvá vás bodne do oka najskôr neznáme bloky try
a
catch
. Názov pre tieto bloky sú výnimky, v
tejto lekcii ich rozoberať nebudeme, preberajú sa kompletne až v kurze o súboroch. Pre nás je momentálne iba
dôležité vedieť, že zachytí kritickú chybu a celá aplikácia vďaka tomu
nespadne. Pokiaľ teda triedy LocalDateTime
alebo
LocalDate
nedokážu naparzovať vstup od užívateľa (tzn. že
zadal chybný formát dátumu a času), vypíšeme hlášku, že nebol dátum
správne zadaný. Keďže máme tieto bloky v nekonečnom cykle
while
, bude sa to opakovať do doby, kým používateľ nezadá
správny formát dátumu.
Obe metódy formátujú dátum známou metódou format()
,
konštanty FORMAT_DATA
a FORMAT_DATA_BEZ_CASU
si o
chvíľu deklarujeme. Metóda naparsujDatum()
by bez času vracalo
nechcený typ LocalDate
, vďaka tomu zavoláme v
return
metódu atStartOfDay()
aby sme vrátili
inštanciu triedy LocalDateTime
.
Pomocou metódy naparsujDatumCas()
budeme teda zadávať dátum
a čas, pomocou metódy naparsujDatum()
budeme zadávať iba
dátum. Druhá metóda bude slúžiť na vyhľadávanie záznamov v určitý
deň, pretože určite nebudeme chcieť odstrániť záznamy v danú hodinu a
minútu, ale záznamy v daný deň bez určenia času.
Konštanty
Do triedy si pridáme už spomínané verejné,
statické a finálne konštanty. Budú to
formattery dátumu a času. Kľúčové slovo final
si vysvetlíme
za chvíľu, statické a verejné atribúty to sú preto, aby boli použiteľné
aj pre ďalšie triedy v našej aplikácii bez vytvorenia inštancie. Každá
trieda môže používať tieto formattery, ktoré máme definované na jednom
mieste:
public static final DateTimeFormatter FORMAT_DATA = DateTimeFormatter.ofPattern("d.M.y H:mm"); public static final DateTimeFormatter FORMAT_DATA_BEZ_CASU = DateTimeFormatter.ofPattern("d.M.y");
Pridáme si ďalší potrebný import:
import java.time.format.DateTimeFormatter;
Kľúčové slovo final
Toto kľúčové slovo sa môže deklarovať na premenné, atribútu, metódy alebo aj triedy.
Na premennej alebo atribúte
Kľúčové slovo final
na atribúte/premennej zamedzí
tomu, aby sa daný atribút/premenná mohla naďalej meniť, bude teda
konštantná (vždy rovnaká). Hodnota do premennej/atribútu
sa nemusí ihneď po deklarácii priradiť, ale pokojne až v priebehu. Má to
však aj malý háčik, pokiaľ deklarujeme napríklad:
public final Clovek clovek;
Do atribútu clovek
už nebudeme môcť priradiť nového
človeka, budeme však môcť stále meniť jeho atribúty, napríklad
clovek.vek = 18
. Atribút teda nie je v tomto prípade kompletne
nemenný. Aby nebolo možné zmeniť aj vek inštancie clovek
,
museli by sme pridať kľúčové slovo final
aj atribútu
vek
v triede Clovek
.
Na triede
Finálna trieda sa už nemôže zmeniť a nemôže sa z nej ani dediť.
Na metódach
Finálne metódy nemôžu byť prepísané (@Override
) alebo
skryté potomkom.
Súbor Zaznam.java
Jeden formatter obsahuje dátum aj čas, jeden iba dátum bez času. Prejdime
do triedy Zaznam.java
a metódu toString()
pozmeňme
takto:
@Override public String toString() { return Diar.FORMAT_DATA.format(datumCas) + " " + text; }
Keby sme si robili inštanciu formatteru znova v každom zázname, bolo by to
nepraktické. Takto máme formattery na jednom mieste a keď sa rozhodneme
formát zmeniť, zmeníme ho len v triede Diar
. So statikou ale
opatrne, nie vždy ju je vhodné použiť.
Súbor Diar.java
Presunieme sa späť do súboru Diar.java
, kde si pridáme
ďalšie metódy.
Metóda vypisZaznamy()
Pridajme metódu vypisZaznamy()
, ktorá nájde záznamy v daný
deň a vypíše ich:
public void vypisZaznamy(LocalDateTime den) { ArrayList<Zaznam> zaznamy = databaze.najdiZaznamy(den, false); for (Zaznam zaznam : zaznamy) { System.out.println(zaznam); } }
Pridáme ďalší import:
import java.util.ArrayList;
Metóda pridejZaznam()
Metóda pre vyzvanie užívateľa na vloženie parametrov nového záznamu a jeho pridanie do databázy bude nasledujúca:
public void pridejZaznam() { LocalDateTime datumCas = naparsujDatumCas(); System.out.println("Zadajte text záznamu:"); String text = scanner.nextLine(); databaze.pridejZaznam(datumCas, text); }
Metóda vyhledejZaznamy()
Zostáva záznamy vyhľadávať a mazať. Metóda na vyhľadanie vráti
kolekciu ArrayList
s nájdenými záznamami (len podľa dátumu,
presný čas nebude hrať rolu). Vyzveme užívateľa na zadanie dátumu a to
odovzdáme databáze. Výsledok zobrazíme:
public void vyhledejZaznamy() { // Zadanie dátumu užívateľom LocalDateTime datumCas = naparsujDatum(); // Vyhľadanie záznamov ArrayList<Zaznam> zaznamy = databaze.najdiZaznamy(datumCas, false); // Výpis záznamov if (zaznamy.size() > 0) { System.out.println("Nájdené tieto záznamy: "); for (Zaznam zaznam : zaznamy) { System.out.println(zaznam); } } else { System.out.println("Neboli nájdené žiadne záznamy."); } }
Metóda vymazZaznamy()
Mazanie záznamov je triviálne:
public void vymazZaznamy() { System.out.println("Budú vymazané záznamy v daný deň a hodinu"); LocalDateTime datumCas = naparsujDatumCas(); databaze.vymazZaznamy(datumCas); }
Metóda
vypisUvodniObrazovku()
Ako posledný pridajme metódu na vypísanie úvodnej obrazovky programu s aktuálnym dátumom a časom a udalosťami na dnešok a zajtrajšok.
public void vypisUvodniObrazovku() { System.out.println(); System.out.println(); System.out.println("Vitajte v diári!"); LocalDateTime dnes = LocalDateTime.now(); System.out.printf("Dnes je: %s%n", FORMAT_DATA.format(dnes)); System.out.println(); // výpis hlavní obrazovky System.out.println("Dnes:\n-----"); vypisZaznamy(dnes); System.out.println(); System.out.println("Zajtra:\n------"); LocalDateTime zitra = LocalDateTime.now().plusDays(1); vypisZaznamy(zitra); System.out.println(); }
Súbor Poznamkovac.java
Môžeme víťazoslávne prejsť do hlavného súboru
Poznamkovac.java
a vytvoriť inštanciu diára. Tu umiestnime aj
hlavný cyklus programu s menu programu a reakciou na voľbu užívateľa. Je to
tá najvyššia vrstva programu:
Scanner scanner = new Scanner(System.in); Diar diar = new Diar(); String volba = ""; // hlavný cyklus while (!volba.equals("4")) { diar.vypisUvodniObrazovku(); System.out.println(); System.out.println("Vyberte si akciu:"); System.out.println("1 - Pridať záznam"); System.out.println("2 - Vyhľadať záznamy"); System.out.println("3 - Vymazať záznam"); System.out.println("4 - Koniec"); volba = scanner.nextLine(); System.out.println(); // reakce na volbu switch (volba) { case "1": diar.pridejZaznam(); break; case "2": diar.vyhledejZaznamy(); break; case "3": diar.vymazZaznamy(); break; case "4": // vyskočí z cyklu while a tým ukončí program break; default: System.out.println("Neplatná voľba, stlačte ľubovoľný kláves a opakujte voľbu."); break; } }
Kód vyššie nie je zložitý a už sme tu podobný mali veľakrát.
Nezabudneme pridať ešte import pre Scanner
:
import java.util.Scanner;
Výslednú aplikáciu som na vyskúšanie požičal priateľke, nižšie vidíme výsledok 🙂:
Konzolová aplikácia
Vitajte v diári!
Dnes je: 13.4.2023 20:22
Dnes:
-----
13.4.2023 10:00 Shopping - Arkády Pankrác
13.4.2023 19:30 Vyvenčiť môjho yorkšírka Dennyho
Zajtra:
------
14.4.2023 14:00 Power plate
Vyberte si akci:
1 - Pridať záznam
2 - Vyhľadať záznamy
3 - Vymazať záznam
4 - Koniec
2
Zadajte dátum v tvare [13.4.2023]:
15.4.2023
Nájdené tieto záznamy:
15.4.2023 9:30 Skúška - Ekonomika cestovného ruchu
Týmto sme si kolekciu ArrayList
osvojili a bude nám pomerne
dlho stačiť. Na záver by som dodal, že takto si môžete urobiť databázu
čohokoľvek. Môžete použiť napr. triedu Student
z lekcie Gettery a settery v
Jave alebo ktorúkoľvek inú triedu. Môžete ukladať články, úlohy,
slony, čokoľvek, čo chcete v databáze spravovať. A čo ďalej?
V nasledujúcej lekcii, Rozhranie (interface) v Jave , si vysvetlíme, čo je to rozhranie.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 1313x (25.87 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java