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, a jejich implementace ( ArrayList, LinkedList, HashSet, TreeSet). 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.
Umět pracovat s výjimkami a generickými typy.
V této úloze implementujeme část knihovního systému. Vaším úkolem bude vytvořit třídy BookImpl, ReaderImpl a ReadersRegisterImpl, které budou implementovat příslušná rozhraní. Význam tříd a popis jejich chování naleznete v komentářích JavaDoc u rozhraní. Konstruktor třídy ReadersRegisterImpl nebude mít žádný konstruktor (tj. bude mít implicitní), ostatní dvě třídy budou mít po jednom konstruktoru podle následující JavaDoc specifikace. Všechny kontruktory vyhodí vhodnou výjimku, pokud je některý ze vstupních argumentů nastaven na null.
/** * @param author Autor knihy * @param title Nazev knihy * @param id Jednoznacny identifikator * @param reg Odkaz na registr ctenaru */ public BookImpl(String author, String title, int id, ReadersRegister reg) /** * @param name Jmeno ctenare * @param id Jednoznacny identifikator */ public ReaderImpl(String name, String id) |
Každá kniha by si měla pamatovat výpůjčky jako posloupnost čtenářů. Čtenáři se mohou v posloupnosti objevit vícekrát.
Registr čtenářů si pamatuje všechny čtenáře a neměl by obsahovat duplicity. Tomu by měl odpovídat i výběr kolekce.
Uspořádaný seznam jmen čtenářů získáte tak, že všechna jména uložíte do seznamu a seznam necháte uspořádat pomocí třídy java.util.Collections
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 všech tříd 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á vyhozená výjimka by měla obsahovat popis, který umožní identifikovat přesnou příčinu problémů. V případě výjimky IllegalArgumentException nebo NullPointerException stačí jako její popis uvést název špatného parametru:
public void metoda(String popis) { if (popis == null) { throw new IllegalArgumentException("popis"); } // kód metody ... } |
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.
Prověřte, že studenti do hlaviček tříd správně doplnili své jméno a popis třídy.
Prověřte, že studenti důsledně používají generické typy.