Úloha číslo 7

Kolekce v Javě

Petr Adámek

Abstract

Cílem této úlohy je naučit se základní práci s různými typy kolekcí.


Table of Contents

Co je potřeba znát
Zadání
Několik rad
Odevzdání úlohy
Metodické pokyny
Pokyny pro opravování

Co je potřeba znát

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.

Zadání

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.

Několik rad

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í.

Odevzdání úlohy

Před odevzdáním úlohy si zkontrolujte:

  1. Zda jde úloha přeložit a zda jdou přeložit i všechny testy.

  2. Zdali všechny testy projdou bez chyby.

  3. 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.)

Metodické pokyny

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í.

Pokyny pro opravování

  • 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.