Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

 

Predchádzajúci článok
Diár s databázou v Jave - Záznam, databáza a diár
Všetky články v sekcii
Objektovo orientované programovanie v Jave
Preskočiť článok
(neodporúčame)
Rozhranie (interface) v Jave
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity