Abstract
Cílem této úlohy je naučit se základní práci s různými typy kolekcí.
Table of Contents
Pro vyřešení této úlohy je třeba
Rozumět principům objektového programování v jazyce Java.
Znát základní typy kolekcí v Javě (Collection, List, Set, Map) a jejich implementace (ArrayList, LinkedList, HashSet, HashMap). Je důležité vědět, čím se jednotlivé typy kolekcí i jejich konkrétní implementace liší a kdy je vhodné kterou z nich použít.
Chápat proncip rozhraní Comparable
.
Umět pracovat s výjimkami a generickými typy.
V této úloze implementujeme jednoduchý systém pro evidenci studentů
a zapsaných předmětů. Vaším úkolem bude vytvořit třídy
StudentImpl
, CourseImpl
a
CatalogImpl
. Třída StudentImpl
bude
implementovat rozhraní Student
, třída
CourseImpl
bude implementovat rozhraní
Course
a třída CatalogImpl
bude
implementovat rozhraní Catalog
. Popis chování
jednotlivých metod naleznete v komentářích JavaDoc u příslušných rozhraní.
Třída CatalogImpl
bude mít veřejný bezparametrický
konstruktor.
K dispozici je testovací třída CatalogTest
, která
slouží jako formální zadání. To znamená, že správné řešení je takové,
které úspěšně projde všemi testy.
Pro úspěšné vyřešení úlohy tak, aby prošla všemi testy, je nuté dodržet několik zásad a pravidel. Možná se Vám některá z nich budou jevit jako zbytečná, nicméně jsou velmi důležitá a jejích dodržování Vám v budoucnu velmi usnadní programování a zejména řešení různých problémových situací.
Všechny atributy tříd CourseImpl
,
StudentImpl
i CatalogImpl
musí
mít přístupová práva private.
Velice důležité je dodržet obecný kontrakt metody equals. Ten je definován ve třídě Object. S tím úzce souvisí i obecný kontrakt metody hashCode.
Každá metoda by si měla ověřit své vstupní parametry a v případě jakýchkoliv problémů by měla vyhodit vhodnou výjimku. Tato výjimka musí být popsána v dokumentaci příslušné metody. V této úloze je typ výjimky vždy předepsán příslušným rozhraním.
Každá vyhozená výjimka by měla obsahovat popis, který umožní identifikovat přesnou příčinu problémů. V případě výjimky NullPointerException stačí jako její popis uvést název špatného parametru:
public void metoda(String popis) { if (popis == null) { throw new NullPointerException("popis"); } // kód metody ... }
Pokud metoda vyhodí výjimku, měla by selhat atomicky.To se v tomto případě týká především metody register, která by v případě jakéhokoliv problému (neexistující student nebo kurz, opakovaný zápis předmětu, paramter null apod.) měla vyhodit výjimku dříve, než se jakýkoliv kurz zapíše. Nemělo by se tedy stát, že po zavolání
catalog.register(student,course1,null,course2);
dojde k zaregistrování kurzu course1 a pak teprve k vyhození výjimky NullPointerException. Tento problém a jeho řešení Vám na cvičení vysvětlí Váš cvičící.
Další rady a návody jak řešit některé z potenciálních problémů Vám poskytnou cvičící v příslušném cvičení.
Před odevzdáním úlohy si zkontrolujte:
Zda jde úloha přeložit a zda jdou přeložit i všechny testy.
Zdali všechny testy projdou bez chyby.
Zda jste nezapomněli správně vyplnit hlavičky všech tříd ve formátu JavaDoc (popis třídy, autor, popis všech metod, apod.)
Je vhodné zopakovat základní typy kolekcí, jejich vlastnosti a vhodnost použit v konkrétním případě. Dále připomeňte základní principy práce s výjimkami a generickými typy. Užitečné je také připomenout obecný kontrakt metod Object.hashCode() a Object.equals() a jak takové metody implementovat. Třída StudentImpl musí implementovat rozhraní Comparable (neboť jej rozšiřuje rozhraní Student), proto také připomeňte, co to vlastně znamená.
Potenciálně problémová je zejména metoda register, u níž je vyžadováno atomické selhání. Tento pojem studentům vysvětlete a zároveň jim naznačte, jak se s ním v tomto případě vypořádat. Pro inspiraci doporučuji nahlédnout do vzorového řešení.